Al terminar, podrás
- Elegir qué tabla debe quedar a la izquierda.
- Interpretar los NULL que representan una coincidencia ausente.
- Distinguir un filtro en ON de un filtro posterior en WHERE.
Recupera lo aprendido: ¿Qué hace INNER JOIN con una fila que no tiene coincidencia en la otra tabla?
La idea clave
LEFT JOIN conserva todas las filas de la tabla situada a la izquierda. Cuando no encuentra coincidencia a la derecha, completa las columnas derechas con NULL.
Pregunta previa: ¿qué conjunto debe aparecer completo? Esa tabla debe quedar a la izquierda. Para buscar clientes con o sin pedidos, empieza por clientes.
La sintaxis básica
SELECT izquierda.columna, derecha.columna
FROM tabla_izquierda AS izquierda
LEFT JOIN tabla_derecha AS derecha
ON izquierda.id = derecha.clave_foranea;Una fila izquierda puede producir varias filas de resultado si encuentra varias coincidencias. Si no encuentra ninguna, produce una sola fila con valores NULL a la derecha.
Ejemplo paso a paso
| id | nombre |
|---|---|
| 1 | Ana Torres |
| 2 | Luis Martín |
| 6 | Pablo Sanz |
| 12 | Mario Gil |
| id | cliente_id |
|---|---|
| 101 | 1 |
| 102 | 2 |
| 103 | 1 |
| 111 | 1 |
| 114 | 2 |
Ana tiene tres pedidos, Luis tiene dos y Pablo y Mario no tienen ninguno.
SELECT c.nombre, p.id AS pedido_id
FROM clientes AS c
LEFT JOIN pedidos AS p
ON c.id = p.cliente_id
WHERE c.id IN (1, 2, 6, 12)
ORDER BY c.id, p.id;| nombre | pedido_id |
|---|---|
| Ana Torres | 101 |
| Ana Torres | 103 |
| Ana Torres | 111 |
| Luis Martín | 102 |
| Luis Martín | 114 |
| Pablo Sanz | NULL |
| Mario Gil | NULL |
Cómo funciona
- Ana y Luis se repiten una vez por cada pedido relacionado.
- Pablo y Mario se conservan porque proceden de la tabla izquierda.
- Sus columnas de pedido contienen
NULL, señal de que no hubo coincidencia. - El orden de las tablas determina qué conjunto queda completo.
Un error habitual
Eliminar sin querer las filas sin coincidencia
SELECT c.nombre, p.id
FROM clientes AS c
LEFT JOIN pedidos AS p ON c.id = p.cliente_id
WHERE p.estado = 'enviado';Para las personas sin pedidos, p.estado es NULL; la condición de WHERE no es verdadera y esas filas desaparecen. Si quieres conservar clientes y limitar las coincidencias a pedidos enviados, coloca el filtro dentro de ON.
Practica con datos
Laboratorio SQL
Resuelve la consulta
Escribe una consulta que devuelva todos los clientes y el id de sus pedidos, incluidos los clientes sin pedidos.
Resultado esperado: 20 filas con nombre, pedido_id. El orden de las filas no importa.
Ver tablas y datos
Cargando la estructura del ejercicio…
Clientes debe ser la tabla izquierda.
Relaciona c.id con p.cliente_id.
Selecciona c.nombre y p.id AS pedido_id.
Solución
SELECT c.nombre, p.id AS pedido_id FROM clientes AS c LEFT JOIN pedidos AS p ON c.id = p.cliente_id;Pablo Sanz y Mario Gil aparecen con pedido_id NULL porque no tienen pedidos asociados.
Puedes consultar la solución y volver a intentarlo. La práctica se completa cuando tu consulta funciona.
La consulta usa datos ficticios y se ejecuta solo en este navegador.
Fuentes técnicas consultadas
Las fuentes confirman que LEFT JOIN añade una fila con valores nulos del lado derecho cuando una fila izquierda no encuentra coincidencia.
- PostgreSQL: comportamiento de LEFT OUTER JOIN
- PostgreSQL: tutorial de uniones entre tablas
- SQLite: procesamiento y sintaxis de JOIN
Comprueba si puedes explicarlo
Ana tiene tres pedidos y Mario ninguno. ¿Cuántas filas producen entre ambos con clientes LEFT JOIN pedidos?
Ver respuesta razonada
Cuatro: tres para Ana y una para Mario con NULL en las columnas del pedido. LEFT JOIN conserva a Mario, pero no reduce a una sola fila los pedidos de Ana.
Responde antes de abrir la explicación. Si necesitaste ayuda, cierra la respuesta y vuelve a explicarlo con tus palabras antes de dar la lección por aprendida.
Qué debes recordar
- LEFT JOIN conserva todas las filas de la tabla izquierda.
- Una fila izquierda puede repetirse si encuentra varias coincidencias.
- Un filtro sobre la tabla derecha en WHERE puede eliminar las filas sin pareja.
A continuación: Continúa con Combina varias tablas sin duplicar filas.