El LEFT JOIN (también llamado LEFT OUTER JOIN) es un tipo de unión en SQL que devuelve todas las filas de la tabla izquierda y las filas coincidentes de la tabla derecha.
Si no hay coincidencias, los valores de la tabla derecha aparecen como NULL.
👉 Es especialmente útil cuando queremos listar todos los registros de una tabla principal, aunque no tengan datos relacionados en otra tabla.
Sintaxis básica de LEFT JOIN
SELECT columnas
FROM tabla1
LEFT JOIN tabla2
ON tabla1.columna = tabla2.columna;
tabla1: tabla izquierda (se muestran todas sus filas).tabla2: tabla derecha (solo se muestran las coincidencias).ON: condición que relaciona ambas tablas.
Ejemplo básico de LEFT JOIN
Supongamos estas tablas:
clientes
| id | nombre |
|---|---|
| 1 | Ana |
| 2 | Luis |
| 3 | Carla |
pedidos
| id | cliente_id | total |
|---|---|---|
| 101 | 2 | 500 |
| 102 | 3 | 300 |
Consulta:
SELECT c.nombre, p.total
FROM clientes c
LEFT JOIN pedidos p
ON c.id = p.cliente_id;
Resultado:
| nombre | total |
|---|---|
| Ana | NULL |
| Luis | 500 |
| Carla | 300 |
👉 Ana aparece en el resultado aunque no tenga pedidos.
El valor de total es NULL porque no hay coincidencia en la tabla pedidos.
LEFT JOIN vs INNER JOIN
- INNER JOIN → devuelve solo las filas con coincidencia en ambas tablas.
- LEFT JOIN → devuelve todas las filas de la tabla izquierda, aunque no haya coincidencia en la derecha.
Ejemplo con los datos anteriores:
INNER JOINdevolvería solo Luis y Carla.LEFT JOINdevuelve Ana, Luis y Carla.
LEFT JOIN con múltiples tablas
Se pueden encadenar varios JOIN en la misma consulta:
SELECT c.nombre, p.id AS pedido, pr.nombre AS producto
FROM clientes c
LEFT JOIN pedidos p ON c.id = p.cliente_id
LEFT JOIN productos pr ON p.producto_id = pr.id;
👉 Muestra todos los clientes, sus pedidos (si existen) y los productos de esos pedidos.
Los clientes sin pedidos aparecen con NULL en las columnas de pedidos y productos.
LEFT JOIN con condiciones adicionales
Podemos aplicar filtros a las filas coincidentes o nulas:
SELECT c.nombre, p.total
FROM clientes c
LEFT JOIN pedidos p ON c.id = p.cliente_id
WHERE p.total > 400;
👉 Solo devuelve clientes que tienen pedidos mayores a 400.
⚠️ Importante: esta condición elimina los NULL.
Si querés mantener los clientes sin pedidos, hay que mover el filtro al JOIN:
SELECT c.nombre, p.total
FROM clientes c
LEFT JOIN pedidos p
ON c.id = p.cliente_id AND p.total > 400;
👉 En este caso, los clientes sin pedidos todavía aparecen.
Ejemplo avanzado: detectar clientes sin pedidos
SELECT c.nombre
FROM clientes c
LEFT JOIN pedidos p ON c.id = p.cliente_id
WHERE p.id IS NULL;
👉 Lista los clientes que no han hecho ningún pedido.
Este patrón es muy común en reportes de «faltantes» o registros huérfanos.
LEFT JOIN y agregaciones
Podemos usar LEFT JOIN con funciones de agregación como COUNT:
SELECT c.nombre, COUNT(p.id) AS cantidad_pedidos
FROM clientes c
LEFT JOIN pedidos p ON c.id = p.cliente_id
GROUP BY c.nombre;
Resultado:
| nombre | cantidad_pedidos |
|---|---|
| Ana | 0 |
| Luis | 1 |
| Carla | 1 |
👉 Gracias al LEFT JOIN, Ana aparece con 0 pedidos.
LEFT JOIN vs RIGHT JOIN
LEFT JOIN: todas las filas de la izquierda.RIGHT JOIN: todas las filas de la derecha.
Ejemplo:
- Si queremos todos los clientes → usar
LEFT JOIN. - Si queremos todos los pedidos, incluso sin cliente válido → usar
RIGHT JOIN.
En la práctica, LEFT JOIN se usa mucho más.
Errores comunes con LEFT JOIN
- Olvidar la condición ON
SELECT * FROM clientes LEFT JOIN pedidos;
👉 Esto genera un producto cartesiano: todas las combinaciones posibles.
- Colocar filtros en WHERE en lugar de ON
👉 Puede eliminar las filas nulas, invalidando el propósito del LEFT JOIN. - Confundir con INNER JOIN
👉 A veces se escribe LEFT JOIN pero se agrega una condición que descarta losNULL. El resultado final termina siendo equivalente a un INNER JOIN.
Buenas prácticas con LEFT JOIN
- Usar alias (
c,p,pr) para mejorar legibilidad. - Asegurar índices en las columnas usadas en
ON(cliente_id,id). - Mover condiciones que afectan la tabla derecha al
ONsi se quieren conservar filas nulas. - Revisar siempre los resultados con
IS NULLpara detectar registros sin coincidencias.
Ejemplo real: clientes y facturas pendientes
SELECT c.nombre, f.monto, f.fecha
FROM clientes c
LEFT JOIN facturas f
ON c.id = f.cliente_id
AND f.pagada = FALSE;
👉 Lista todos los clientes y, si tienen facturas pendientes, muestra el monto y la fecha.
Si no tienen facturas pendientes, aparecen con NULL.
LEFT JOIN en distintos motores
- MySQL/MariaDB: soportado completamente.
- PostgreSQL: soportado.
- SQL Server: soportado.
- Oracle: soportado (sintaxis moderna
LEFT JOIN). En versiones antiguas se usaba(+).
Preguntas frecuentes (FAQ)
1. ¿LEFT JOIN y LEFT OUTER JOIN son lo mismo?
Sí. La palabra OUTER es opcional.
2. ¿Qué pasa si no hay coincidencias en la tabla derecha?
El resultado muestra NULL en las columnas de esa tabla.
3. ¿Se pueden unir más de dos tablas con LEFT JOIN?
Sí, se pueden encadenar múltiples LEFT JOIN en la misma consulta.
4. ¿LEFT JOIN afecta el rendimiento?
Sí, puede ser más costoso que INNER JOIN, especialmente en tablas grandes sin índices.
5. ¿Qué diferencia hay entre LEFT JOIN y RIGHT JOIN?
Son equivalentes, pero intercambiando el orden de las tablas. La práctica habitual es usar LEFT JOIN por convención.
Conclusión
El LEFT JOIN en SQL es una herramienta fundamental para obtener todos los registros de una tabla principal, aunque no tengan coincidencias en otra.
- Es ideal para reportes de «faltantes» o «sin relación».
- Permite detectar registros huérfanos.
- Se combina muy bien con agregaciones (
COUNT,SUM).
Dominar su uso es clave para trabajar con bases de datos relacionales de manera profesional.
Mira ejemplos y trampas comunes en JOINS y repasa más definiciones en el Glosario SQL completo.