Tutorial de SQL

Cómo usar HAVING en SQL (y en qué se diferencia de WHERE)

HAVING filtra grupos ya formados: va justo después del GROUP BY y su condición usa funciones de agregado, como HAVING COUNT(*) >= 3. WHERE, en cambio, filtra filas antes de agrupar. Aquí verás la sintaxis, un ejemplo resuelto con las ciudades donde viven tres alumnos o más y por qué WHERE COUNT(*) da error.

HAVING: filtrar grupos

WHERE filtra filas antes de agrupar. Pero a veces la condición es sobre el resumen del grupo («proveedores con 3 productos o más»), y ese número solo existe después del GROUP BY.

Para eso está HAVING: va justo después del GROUP BY y su condición usa funciones de agregado, como HAVING COUNT(*) >= 3.

Cómo se escribe

SELECT columna, COUNT(*) FROM tabla GROUP BY columna HAVING COUNT(*) >= 3

GROUP BY columna
forma los grupos
HAVING
filtra los grupos ya formados
COUNT(*) >= 3
solo pasan los grupos con 3 filas o más

Ejemplo resuelto

SELECT ciudad, COUNT(*) FROM alumnos GROUP BY ciudad HAVING COUNT(*) >= 3
Número de fila#ciudadCOUNT(*)
1Metepec3
2Toluca4

Ciudades donde viven 3 alumnos o más.

  • WHERE COUNT(*) >= 3 da error: WHERE no puede usar funciones de agregado.
  • Recuerda: WHERE es para filas, HAVING es para grupos.

Preguntas frecuentes

¿Cuál es la diferencia entre WHERE y HAVING?

WHERE filtra filas antes de agrupar; HAVING filtra grupos después del GROUP BY. WHERE es para filas, HAVING es para grupos.

¿Por qué WHERE COUNT(*) >= 3 da error?

Porque WHERE no puede usar funciones de agregado: ese conteo solo existe después de agrupar. Para eso está HAVING.