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;
  
Abrir en editor

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;
  
Abrir en editor

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;
  
Abrir en editor

Resultado: en la demo, Laura es la empleada con más de un pedido gestionado.


Resumen

  • WHERE filtra filas antes de agrupar; HAVING filtra grupos después.
  • En HAVING puedes usar COUNT , SUM , AVG
  • Combina JOIN + GROUP BY + HAVING cuando 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.