HAVING frente a WHERE
Distinga HAVING (filtra grupos) de WHERE (filtra filas) y aplique ambas correctamente en la misma consulta.
HAVING frente a WHERE es una lección gratuita de SQL Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de SQL Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Academy incluye 4 lecciones en total.
Dos etapas de filtrado
WHERE filtra filas individuales ANTES de agruparlas. HAVING filtra grupos DESPUÉS de la agregación. Parecen similares, pero operan en etapas diferentes.
Ejemplo de WHERE
WHERE filtra las filas sin procesar. No puede acceder a las agregaciones:
-- Sum totals for rows where status is 'paid':
SELECT user_id, SUM(total) AS revenue
FROM orders
WHERE status = 'paid'
GROUP BY user_id;Ejemplo de HAVING
HAVING filtra grupos. Puede hacer referencia a agregaciones:
SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5; -- only users with ≥ 5 ordersCombinar WHERE y HAVING
Ambas cláusulas pueden aparecer en la misma consulta:
SELECT user_id, SUM(total) AS revenue
FROM orders
WHERE created_at >= NOW() - INTERVAL '90 days'
GROUP BY user_id
HAVING SUM(total) > 1000;No coloque agregaciones en WHERE
El planificador ejecuta WHERE antes de agrupar; las agregaciones todavía no están disponibles:
-- WRONG:
SELECT user_id, COUNT(*) FROM orders
WHERE COUNT(*) > 5 -- ERROR
GROUP BY user_id;
-- RIGHT — move to HAVING:
SELECT user_id, COUNT(*) FROM orders
GROUP BY user_id
HAVING COUNT(*) > 5;Mueva los predicados a WHERE cuando sea posible
WHERE filtra antes de agrupar, por lo que entran menos filas en la agregación. Use HAVING únicamente para las condiciones que no se puedan expresar en WHERE.
-- Slightly slower (filters after grouping):
SELECT user_id, COUNT(*) FROM orders
GROUP BY user_id
HAVING user_id IN (1,2,3);
-- Faster (filters before grouping):
SELECT user_id, COUNT(*) FROM orders
WHERE user_id IN (1,2,3)
GROUP BY user_id;Orden lógico de ejecución
Orden conceptual:
FROM— selecciona las tablas y realiza las combinacionesWHERE— filtra las filasGROUP BY— crea los gruposHAVING— filtra los gruposSELECT— proyecta las columnasORDER BY— ordenaLIMIT— obtiene las primeras N filas
HAVING sin GROUP BY
Puede usar HAVING sin GROUP BY; toda la tabla se convierte en un solo grupo:
SELECT SUM(total) FROM orders
HAVING SUM(total) > 1000000; -- prints only if total over 1MAlias en HAVING
Algunas bases de datos permiten que HAVING haga referencia a alias de SELECT; PostgreSQL y MySQL lo permiten, pero el estándar SQL no. La opción más compatible es repetir la agregación:
SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5; -- portable
-- HAVING order_count >= 5 -- works in PG / MySQLHAVING con varias agregaciones
Use HAVING para condiciones compuestas sobre agregaciones:
SELECT user_id, COUNT(*) AS orders, SUM(total) AS revenue
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5 AND SUM(total) > 1000;Nota sobre el rendimiento
Un filtro de agregación en HAVING no puede usar índices del mismo modo que WHERE sobre una columna. Mueva a WHERE todo lo que sea posible.
Resumen
WHERE = filtra filas. HAVING = filtra grupos.
- Las agregaciones solo se usan en
HAVING, nunca enWHERE - Mueva los predicados a
WHEREpara mejorar el rendimiento - Use ambas cuando sea necesario
Comprobación rápida
Desea obtener los usuarios que han realizado más de 10 pedidos. ¿Qué cláusula se encarga de filtrarlos?
Preguntas frecuentes
¿La lección «HAVING frente a WHERE» es gratis?
Sí — el texto completo de «HAVING frente a WHERE» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de SQL Academy, actualiza a CoddyKit PRO. El curso de SQL Academy incluye 4 lecciones en total.
¿Qué aprenderé en «HAVING frente a WHERE»?
Distinga HAVING (filtra grupos) de WHERE (filtra filas) y aplique ambas correctamente en la misma consulta. Practicas SQL Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar SQL Academy?
No se requiere experiencia previa. SQL Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «HAVING frente a WHERE»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de SQL Academy?
Sí. Cada lección de SQL Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- COUNT, SUM, AVG, MIN y MAX
- GROUP BY con una o varias columnas
- HAVING frente a WHERE
- Errores habituales: valores NULL en agregaciones