M09L11Semana 3~5 h
L11 — Subconsultas y HAVING
~5.0 h · Semana 3
“Clientes con más de 2 citas completadas” pide filtrar grupos, no filas.
Objetivo
Crear sql/subq-clientes-frecuentes.sql con HAVING y al menos una subconsulta.
Pasos
1. Lectura (40 min)
Subconsultas escalares, IN/EXISTS, y HAVING.
2. HAVING (60 min)
SELECT cl.nombre, count(*) AS completadas
FROM citas c
JOIN clientes cl ON cl.id = c.cliente_id
WHERE c.estado = 'completada'
GROUP BY cl.id, cl.nombre
HAVING count(*) >= 2
ORDER BY completadas DESC;
3. Subconsulta (60 min)
Lista servicios que nunca se han agendado (NOT EXISTS o LEFT JOIN … IS NULL). Prefiere EXISTS y explica por qué en un comentario.
4. Compara mentalmente con JOIN (30 min)
Reescribe una de las dos con puro JOIN. ¿Más legible? Anota preferencia.
5. Commit (15 min)
Lectura de esta lección
| Fuente | Qué leer | Enlace |
|---|---|---|
| Fundamentos de BD — Elmasri & Navathe (ed. ES) | Elmasri: subconsultas; HAVING | Tutorial PostgreSQL |
| Catálogo | Entrada de esta materia | Bibliografía · M09 |
Hecho cuando
Marca la lección solo si:
- Una query con
HAVINGy otra con subconsulta (IN/EXISTS/ escalar). - Ambas ejecutadas con comentario de salida.
- Commit.
Errores comunes
- Usar
WHERE count(*) > 1en lugar deHAVING. - Subconsulta correlacionada innecesariamente lenta sin mirar el plan (eso es L14; hoy solo correctness).
- Clientes frecuentes incluyendo solo canceladas.