Al terminar, podrás
- Distinguir una condición de fila de una condición de grupo.
- Filtrar resultados calculados con COUNT, SUM o AVG.
- Combinar WHERE, GROUP BY y HAVING en el orden adecuado.
Recupera lo aprendido: Después de GROUP BY departamento, ¿una fila representa a una persona o a un departamento?
La idea clave
WHERE decide qué filas entran en los grupos; HAVING decide qué grupos permanecen después de calcular sus agregaciones.
Orden mental: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY. No describe necesariamente el algoritmo interno del motor, pero ayuda a colocar cada condición en la cláusula correcta.
La sintaxis básica
SELECT columna_grupo,
AVG(columna) AS media
FROM tabla
WHERE condición_de_fila
GROUP BY columna_grupo
HAVING AVG(columna) > límite;Utiliza HAVING cuando la condición depende de una agregación como COUNT, SUM o AVG. Utiliza WHERE cuando la condición puede decidirse fila por fila antes de agrupar.
Ejemplo paso a paso
| departamento | salario_medio |
|---|---|
| Dirección | 52000,00 |
| Tecnología | 42500,00 |
| Ventas | 32333,33 |
| Marketing | 30750,00 |
| Soporte | 28250,00 |
Queremos conservar únicamente los departamentos cuya media supera 30.000.
SELECT departamento,
ROUND(AVG(salario), 2) AS salario_medio
FROM empleados
GROUP BY departamento
HAVING AVG(salario) > 30000
ORDER BY salario_medio DESC;| departamento | salario_medio |
|---|---|
| Dirección | 52000,00 |
| Tecnología | 42500,00 |
| Ventas | 32333,33 |
| Marketing | 30750,00 |
Cómo funciona
GROUP BYforma cinco departamentos.AVG(salario)calcula una media dentro de cada uno.HAVINGelimina Soporte porque su media es 28.250.ORDER BYpresenta los cuatro grupos restantes de mayor a menor.
Un error habitual
Intentar calcular una agregación dentro de WHERE
SELECT departamento, AVG(salario)
FROM empleados
WHERE AVG(salario) > 30000
GROUP BY departamento;WHERE se evalúa antes de que exista la media. Mueve esa condición a HAVING. Si además quieres descartar salarios individuales, esa segunda condición sí puede ir en WHERE.
Practica con datos
Laboratorio SQL
Resuelve la consulta
Calcula el salario medio por departamento. Devuelve departamento y la media con alias media; conserva solo medias superiores a 30000.
Resultado esperado: 4 filas con departamento, media. El orden de las filas no importa.
Ver tablas y datos
Cargando la estructura del ejercicio…
Agrupa por departamento.
Calcula AVG(salario).
Filtra el resumen con HAVING.
Solución
SELECT departamento, AVG(salario) AS media FROM empleados GROUP BY departamento HAVING AVG(salario) > 30000;La condición se aplica después de calcular la media de cada departamento.
Puedes consultar la solución y volver a intentarlo. La práctica se completa cuando tu consulta funciona.
La consulta usa datos ficticios y se ejecuta solo en este navegador.
¿Dudas entre WHERE y HAVING? Consulta la comparación paso a paso. Abrir la guía comparativa.
Fuentes técnicas consultadas
Las referencias confirman que HAVING se evalúa por grupo y que las expresiones agregadas no pertenecen a WHERE porque todavía no se han calculado en esa fase lógica.
- PostgreSQL: GROUP BY y HAVING
- PostgreSQL: ubicación válida de expresiones agregadas
- SQLite: evaluación de HAVING por grupo
Comprueba si puedes explicarlo
¿WHERE salario > 30000 y HAVING AVG(salario) > 30000 responden la misma pregunta?
Ver respuesta razonada
No. WHERE excluye personas antes de calcular la media. HAVING calcula la media con las personas que llegaron al grupo y después decide si conserva el departamento.
Responde antes de abrir la explicación. Si necesitaste ayuda, cierra la respuesta y vuelve a explicarlo con tus palabras antes de dar la lección por aprendida.
Qué debes recordar
- WHERE filtra filas antes de agrupar.
- HAVING filtra grupos después de calcular sus agregaciones.
- Una condición sobre COUNT, SUM o AVG suele pertenecer a HAVING.
A continuación: Continúa con la práctica de filtros y resúmenes.