Al terminar esta lección podrás
- Construir resúmenes por etapas.
- Separar condiciones de fila y grupo.
- Interpretar resultados agregados.
Antes de empezar: Funciones de agregación, GROUP BY y HAVING. Explica en una frase qué recuerdas antes de continuar.
La idea, sin código
Las consultas de resumen se construyen por etapas: filtrar filas válidas, formar grupos, calcular valores, filtrar grupos y ordenar el resultado.
Pregunta guía: ¿qué representa cada fila antes y después de aplicar este concepto?
Sintaxis mínima
FROM → WHERE → GROUP BY → agregaciones → HAVING → ORDER BYPrimer ejemplo guiado
| id | nombre | ciudad | |
|---|---|---|---|
| 1 | Ana | Madrid | ana@ejemplo.es |
| 2 | Luis | Valencia | luis@ejemplo.es |
| 3 | Marta | Madrid | NULL |
| 4 | Omar | Sevilla | omar@ejemplo.es |
| 5 | Nora | Bilbao | nora@ejemplo.es |
Analiza la consulta antes de comprobar el resultado:
SELECT ciudad, COUNT(*) AS clientes
FROM clientes
WHERE email IS NOT NULL
GROUP BY ciudad
HAVING COUNT(*) >= 1
ORDER BY clientes DESC, ciudad;| ciudad | clientes |
|---|---|
| Bilbao | 1 |
| Madrid | 1 |
| Sevilla | 1 |
| Valencia | 1 |
Qué ocurre paso a paso
- WHERE excluye filas sin email.
- GROUP BY resume por ciudad.
- HAVING y ORDER BY actúan sobre el resultado agrupado.
Error frecuente
Consulta o razonamiento problemático
SELECT categoria, SUM(stock) FROM productos HAVING stock > 0 GROUP BY categoria;El filtro por stock individual pertenece a WHERE y GROUP BY debe aparecer antes de HAVING.
Práctica guiada
Resuelve una sola dificultad cada vez
Muestra categorías con al menos dos productos disponibles y su stock total.
Solución razonada
SELECT categoria, SUM(stock) AS stock_total FROM productos WHERE stock > 0 GROUP BY categoria HAVING COUNT(*) >= 2;El orden lógico separa la condición de fila —stock— de la condición de grupo —cantidad de productos—.
Comprueba: identifica qué parte recupera, filtra, transforma, relaciona o modifica los datos.
Ahora sin guía
Transfiere lo aprendido
Resume la facturación no cancelada por cliente_id y ordena de mayor a menor.
Comparar con una solución posible
SELECT cliente_id, SUM(total) AS facturacion
FROM pedidos
WHERE estado <> 'cancelado'
GROUP BY cliente_id
ORDER BY facturacion DESC;Puede existir otra solución válida. Comprueba que produce el resultado pedido y que puedes explicar cada cláusula.
Resumen para llevarte
- Construye consultas de resumen por etapas.
- Comprueba la unidad de cada fila final.
- WHERE y HAVING responden preguntas distintas.
Siguiente paso: Continúa con Relaciones, claves primarias y claves foráneas.