Módulo 3 · Organizar y resumir

Filtra grupos con HAVING

Muestra solo los grupos cuyo resumen cumple una condición.

18 minNivel InicialAntes necesitas: GROUP BY

0 de 45 lecciones

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

Estructura
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

Salarios medios calculados por departamento
departamentosalario_medio
Dirección52000,00
Tecnología42500,00
Ventas32333,33
Marketing30750,00
Soporte28250,00

Queremos conservar únicamente los departamentos cuya media supera 30.000.

SQL
SELECT departamento,
       ROUND(AVG(salario), 2) AS salario_medio
FROM empleados
GROUP BY departamento
HAVING AVG(salario) > 30000
ORDER BY salario_medio DESC;
Resultado esperado
departamentosalario_medio
Dirección52000,00
Tecnología42500,00
Ventas32333,33
Marketing30750,00

Cómo funciona

  1. GROUP BY forma cinco departamentos.
  2. AVG(salario) calcula una media dentro de cada uno.
  3. HAVING elimina Soporte porque su media es 28.250.
  4. ORDER BY presenta los cuatro grupos restantes de mayor a menor.
Comprueba tu comprensión

¿Dónde debe escribirse una condición COUNT(*) >= 2?

Un error habitual

Intentar calcular una agregación dentro de WHERE

Ejemplo con error
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

Pendiente

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…

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.

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.

Conceptos relacionados