HAVING en SQL
La cláusula
HAVING
en SQL filtra grupos después de
GROUP BY
. Mientras
WHERE
descarta filas antes de agrupar,
HAVING
aplica condiciones sobre funciones de agregación (
COUNT
,
SUM
…) después de formar los grupos.
GROUP BY transforma filas individuales en resúmenes por categoría. Es el equivalente SQL de «agrupar por país y contar clientes» o «sumar ventas por mes».
Toda columna del SELECT que no esté agregada debe aparecer en el GROUP BY. Si filtras grupos, usa HAVING, no WHERE.
GROUP BY transforma filas individuales en resúmenes por categoría. Es el equivalente SQL de «agrupar por país y contar clientes» o «sumar ventas por mes».
Toda columna del SELECT que no esté agregada debe aparecer en el GROUP BY. Si filtras grupos, usa HAVING, no WHERE.
Ejemplo: «países con más de tres clientes» requiere primero agrupar por país, contar con
COUNT
y luego
HAVING COUNT(...) > 3
. No puedes usar esa condición en
WHERE
porque
COUNT
aún no existe en ese punto.
WHERE vs HAVING en SQL
La confusión más habitual es intentar filtrar grupos con
WHERE
. Esta tabla resume la diferencia:
| Aspecto | WHERE |
HAVING |
|---|---|---|
| Momento en la consulta | Antes de GROUP BY |
Después de GROUP BY |
| Qué filtra | Filas individuales | Grupos ya formados |
| Funciones de agregación | No (no existen aún) | Sí (COUNT, SUM…) |
| Ejemplo en la demo | WHERE Pais = 'España' |
HAVING COUNT(*) > 3 |
Sintaxis de HAVING en SQL
Orden habitual de una consulta con agrupación y filtro de grupos:
SELECT
→
FROM
→
WHERE
(filtra filas) →
GROUP BY
→
HAVING
(filtra grupos) →
ORDER BY
.
Plantilla
SELECT columna_grupo, COUNT(*)
FROM nombre_tabla
WHERE condicion
GROUP BY columna_grupo
HAVING COUNT(*) > umbral
ORDER BY columna_grupo;
HAVING: filtrar grupos con COUNT
Solo grupos cuyo recuento supera 1:
HAVING COUNT > 1
SELECT Pais, COUNT(ID_Cliente) AS Total
FROM Clientes
GROUP BY Pais
HAVING COUNT(ID_Cliente) > 1;
Resultado: en la demo, España es el único país con más de un cliente.
HAVING con umbral numérico
Países con más de tres clientes:
HAVING COUNT > 3
SELECT Pais, COUNT(ID_Cliente) AS Total
FROM Clientes
GROUP BY Pais
HAVING COUNT(ID_Cliente) > 3;
Nota: en la demo, solo España supera el umbral de tres clientes; el resultado coincide con el ejemplo anterior.
HAVING con JOIN en SQL
Empleados que han gestionado más de un pedido — une
Pedidos
y
Empleados
, agrupa y filtra con
HAVING
:
Empleados con varios pedidos
SELECT Empleados.Nombre, COUNT(Pedidos.ID_Pedido) AS Num_Pedidos
FROM Pedidos
INNER JOIN Empleados ON Pedidos.ID_Empleado = Empleados.ID_Empleado
GROUP BY Empleados.Nombre
HAVING COUNT(Pedidos.ID_Pedido) > 1;
Resultado: en la demo, Laura es la empleada con más de un pedido gestionado.
Resumen
-
WHEREfiltra filas antes de agrupar;HAVINGfiltra grupos después. -
En
HAVINGpuedes usarCOUNT,SUM,AVG… -
Combina
JOIN+GROUP BY+HAVINGcuando el resumen cruza varias tablas.
Cómo practicar en el editor
1. Pulsa Pruébalo tú mismo en un ejemplo.
2. Cambia un filtro, columna o literal.
3. Ejecuta y compara el resultado con la tabla de ejemplo.
Comprueba lo aprendido
Responde 2–3 preguntas sobre esta lección. Verás ✓ en verde si aciertas o ✗ en rojo si fallas.