Al terminar esta lección podrás
- Escribir un LEFT JOIN.
- Interpretar NULL de la tabla derecha.
- Evitar convertirlo accidentalmente en INNER JOIN.
Antes de empezar: INNER JOIN. Explica en una frase qué recuerdas antes de continuar.
La idea, sin código
LEFT JOIN conserva todas las filas de la tabla izquierda. Cuando no existe una pareja, las columnas de la derecha aparecen como NULL.
Pregunta guía: ¿qué representa cada fila antes y después de aplicar este concepto?
Sintaxis mínima
FROM tabla_principal AS a
LEFT JOIN tabla_relacionada AS b
ON ...Primer 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 |
| id | cliente_id | fecha | total | estado |
|---|---|---|---|---|
| 101 | 1 | 2026-07-02 | 65 | enviado |
| 102 | 2 | 2026-07-04 | 189 | pendiente |
| 103 | 1 | 2026-07-09 | 44 | enviado |
| 104 | 3 | 2026-07-11 | 899 | cancelado |
| 105 | 5 | 2026-07-15 | 118 | enviado |
Analiza la consulta antes de comprobar el resultado:
SELECT c.nombre, p.id AS pedido
FROM clientes AS c
LEFT JOIN pedidos AS p ON c.id = p.cliente_id
ORDER BY c.id, p.id;| nombre | pedido |
|---|---|
| Ana | 101 |
| Ana | 103 |
| Luis | 102 |
| Marta | 104 |
| Omar | NULL |
| Nora | 105 |
Qué ocurre paso a paso
- Todos los clientes permanecen.
- Ana aparece dos veces porque tiene dos pedidos.
- Omar aparece con pedido NULL porque no tiene coincidencia.
Error frecuente
Consulta o razonamiento problemático
LEFT JOIN pedidos p ON c.id = p.cliente_id WHERE p.estado = 'enviado'El filtro en WHERE elimina los NULL y puede convertir el resultado en equivalente a INNER JOIN. Si quieres conservar clientes sin pedidos, mueve el criterio a ON.
Práctica guiada
Resuelve una sola dificultad cada vez
Muestra todos los autores y, cuando exista, el título de sus libros.
Solución razonada
SELECT a.nombre, l.titulo FROM autores AS a LEFT JOIN libros AS l ON a.id = l.autor_id;Almudena Grandes aparece aunque no exista un libro asociado en los datos.
Comprueba: identifica qué parte recupera, filtra, transforma, relaciona o modifica los datos.
Ahora sin guía
Transfiere lo aprendido
Cuenta pedidos por cliente incluyendo quienes tienen cero.
Comparar con una solución posible
SELECT c.nombre, COUNT(p.id) AS pedidos
FROM clientes AS c
LEFT JOIN pedidos AS p ON c.id = p.cliente_id
GROUP BY c.id, c.nombre;Puede existir otra solución válida. Comprueba que produce el resultado pedido y que puedes explicar cada cláusula.
Resumen para llevarte
- LEFT JOIN conserva la entidad principal.
- COUNT(p.id) devuelve cero cuando no hay pedido.
- Los filtros de la tabla derecha requieren atención.
Siguiente paso: Continúa con JOIN múltiples y duplicación de filas.