> lección 11/18 · 16 min

GROUP BY y HAVING

Concepto

GROUP BY separa las filas en grupos según una columna y calcula las agregaciones dentro de cada grupo. En vez de un promedio para toda la tabla, obtienes un promedio por curso, por ciudad o por estado. Es la tabla dinámica de SQL.

Sintaxis
SELECT columna_grupo, AGREGACION(columna) AS alias
FROM tabla
GROUP BY columna_grupo
HAVING condición_sobre_el_grupo;

Un resumen por grupo. Cada grupo produce una fila. En el SELECT van la columna del grupo y agregaciones; nada más.

SELECT ciudad, COUNT(*) AS estudiantes FROM estudiantes GROUP BY ciudad;

Varias agregaciones por grupo. Igual que en la lección anterior, pero calculadas dentro de cada grupo.

SELECT ciudad, COUNT(*) AS estudiantes, ROUND(AVG(edad), 1) AS edad_promedio FROM estudiantes GROUP BY ciudad;

WHERE filtra filas, HAVING filtra grupos. WHERE decide qué filas entran a los grupos, antes de agrupar. HAVING decide qué grupos salen en el resultado, después de calcular. Por eso una condición sobre COUNT(*) o AVG(...) solo puede ir en HAVING.

SELECT ciudad, COUNT(*) AS estudiantes
FROM estudiantes
WHERE edad >= 21
GROUP BY ciudad
HAVING COUNT(*) >= 2;

El orden de las cláusulas. SELECT, FROM, JOIN, WHERE, GROUP BY, HAVING, ORDER BY y LIMIT. El ORDER BY puede usar el alias de una agregación.

> tarea SQL

Por cada curso, muestra titulo, inscritos (cuántas inscripciones tiene) y promedio (la nota promedio, redondeada a 2 decimales). Muestra solo los cursos con más de una inscripción, ordenados del promedio más bajo al más alto, para revisar primero los cursos con más dificultades.

Tablas disponibles
  • cursos: id, titulo, nivel, horas
  • estudiantes: id, nombre, correo, edad, ciudad
  • inscripciones: id, estudiante_id, curso_id, nota, estado

Primero intenta: las pistas aparecen después de 2 intentos con un resultado incorrecto (los errores de código no cuentan). Llevas 0.

Aprueba las tareas de esta lección para ver el cierre.