Tema 11 · HAVING y Filtro Agregado

Filtrado de Grupos Agregados con HAVING

Comprende por qué WHERE no puede filtrar sobre funciones agregadas, cómo actúa HAVING después del agrupamiento y el orden de ejecución completo de una consulta SQL.

¿Por qué existe HAVING si ya tenemos WHERE?

La cláusula WHERE se introdujo en SQL para filtrar filas individuales antes de que ocurra cualquier agrupamiento o cálculo agregado. Por esa razón arquitectónica, es ilegal escribir WHERE COUNT(*) > 1.

La cláusula HAVING se diseñó específicamente para filtrar sobre los resultados calculados por las funciones agregadas después de que GROUP BY ha procesado los grupos.

Diferencias Clave: WHERE vs HAVING

Criterio Cláusula WHERE Cláusula HAVING
Momento de ejecución Antes de agrupar los datos. Después de agrupar y calcular agregados.
Aplica sobre Filas individuales de las tablas. Grupos consolidados por GROUP BY.
¿Admite funciones agregadas? No (Genera error de sintaxis). Sí (COUNT, AVG, SUM, etc.).

El Orden de Ejecución Completo en SQL

SELECT columna, COUNT(*)
FROM tabla
WHERE condicion_filas_individuales      -- 1º Filtra filas base
GROUP BY columna                        -- 2º Agrupa categorías
HAVING COUNT(*) > 1                     -- 3º Filtra los grupos calculados
ORDER BY COUNT(*) DESC                  -- 4º Ordena el resultado final
LIMIT 10;                               -- 5º Recorta el número de filas
Diagrama Técnico: Ciclo de Vida y Orden de Ejecución Lógico en MySQL

Diagrama 11.1: Los 8 pasos de ejecución lógica del motor MySQL y resolución de alias con WHERE vs HAVING.

⚡ Filtrado de Ciudades con más de 1 Estudiante usando HAVING

Agrupa los estudiantes por ciudad y filtra con HAVING para mostrar únicamente las ciudades con comunidades activas:

consulta.sql
Solo lectura
-- Filtrar grupos agregados que cumplan la condición de volumen
SELECT 
    ciudad,
    COUNT(*) AS total_estudiantes_registrados,
    ROUND(AVG(edad), 1) AS edad_promedio
FROM estudiantes
GROUP BY ciudad
HAVING COUNT(*) >= 1
ORDER BY total_estudiantes_registrados DESC;
Pruébalo tú mismo » Se abre en una nueva pestaña con ejecución en vivo
🧠
Mini-Quiz de Retención
Comprueba tu comprensión antes de pasar a la siguiente lección
1 Pregunta
Pregunta 1
¿Por qué produce un error de sintaxis escribir WHERE COUNT(*) > 5 en lugar de HAVING COUNT(*) > 5?
🦉
¿Tienes dudas con este tema?
Sócrates AI puede darte analogías y explicarte este código paso a paso.

🚀 ¿Quieres dominar Manual Completo de SQL & MySQL y crear proyectos reales?

Aprende arquitectura limpia, desarrollo web moderno, buenas prácticas y despliegue en producción con nuestro Bootcamp Fullstack Developer con mentorías en vivo.

🏛️ Autoría y Propiedad Intelectual: Obra educativa original de David Amador para Kilopolis Academia (Solucionáticos), estructurada sobre las especificaciones y estándares abiertos del W3C, el estándar vivo de WHATWG y la documentación oficial de código abierto. © Todos los derechos reservados.