Al terminar esta lección podrás
- Elegir INNER o LEFT JOIN.
- Comprobar cardinalidad.
- Combinar JOIN, filtros y agregaciones.
Antes de empezar: Relaciones, INNER JOIN, LEFT JOIN y agregaciones. Explica en una frase qué recuerdas antes de continuar.
La idea, sin código
La estrategia segura es identificar la entidad principal, dibujar las claves, decidir si deben conservarse filas sin pareja y comprobar la cardinalidad antes de resumir.
Pregunta guía: ¿qué representa cada fila antes y después de aplicar este concepto?
Sintaxis mínima
-- Entidad principal
-- Relación ON
-- Tipo de JOIN
-- Filas esperadas
-- Resumen finalPrimer ejemplo guiado
| id | nombre |
|---|---|
| 1 | Carlos Ruiz Zafón |
| 2 | Carmen Laforet |
| 3 | Miguel Delibes |
| 4 | Almudena Grandes |
| id | titulo | autor_id | disponible |
|---|---|---|---|
| 1 | La sombra del viento | 1 | 1 |
| 2 | Nada | 2 | 0 |
| 3 | El camino | 3 | 1 |
| 4 | Marina | 1 | 1 |
Analiza la consulta antes de comprobar el resultado:
SELECT a.nombre, COUNT(l.id) AS libros
FROM autores AS a
LEFT JOIN libros AS l ON a.id = l.autor_id
GROUP BY a.id, a.nombre
ORDER BY libros DESC, a.nombre;| nombre | libros |
|---|---|
| Carlos Ruiz Zafón | 2 |
| Carmen Laforet | 1 |
| Miguel Delibes | 1 |
| Almudena Grandes | 0 |
Qué ocurre paso a paso
- Autores es la entidad que debe aparecer siempre.
- LEFT JOIN conserva autores sin libros.
- COUNT(l.id) produce cero para Almudena.
Error frecuente
Consulta o razonamiento problemático
SELECT a.nombre, COUNT(*) FROM autores a LEFT JOIN libros l ON a.id = l.autor_id GROUP BY a.nombre;COUNT(*) contaría una fila incluso para el autor sin libros. Cuenta l.id para medir coincidencias reales.
Práctica guiada
Resuelve una sola dificultad cada vez
Muestra cada cliente y cuántos pedidos enviados tiene, incluyendo cero.
Solución razonada
SELECT c.nombre, COUNT(p.id) AS enviados FROM clientes AS c LEFT JOIN pedidos AS p ON c.id = p.cliente_id AND p.estado = 'enviado' GROUP BY c.id, c.nombre;Esta forma conserva todos los clientes y cuenta únicamente coincidencias enviadas.
Comprueba: identifica qué parte recupera, filtra, transforma, relaciona o modifica los datos.
Ahora sin guía
Transfiere lo aprendido
Crea una consulta que muestre préstamos abiertos con título y socio.
Comparar con una solución posible
SELECT l.titulo, p.socio
FROM prestamos AS p
JOIN libros AS l ON p.libro_id = l.id
WHERE p.fecha_devolucion IS NULL;Puede existir otra solución válida. Comprueba que produce el resultado pedido y que puedes explicar cada cláusula.
Resumen para llevarte
- Empieza por la entidad que quieres conservar.
- Comprueba la condición ON con las claves.
- Cuenta una columna de la tabla relacionada cuando necesites cero.
Siguiente paso: Continúa con Subconsultas: usar el resultado de otra consulta.