Lección 5.3: LEFT JOIN - Incluyendo Todos los Registros de la Tabla Izquierda
Mientras que el INNER JOIN solo devuelve filas donde hay una coincidencia en ambas tablas, hay muchos escenarios en los que deseas mantener todos los registros de una tabla, incluso si no tienen una coincidencia en la otra. Esto es exactamente lo que hace el LEFT JOIN (también conocido como LEFT OUTER JOIN).
¿Qué es un LEFT JOIN?
Un LEFT JOIN devuelve todas las filas de la tabla "izquierda" (la que se menciona primero en la consulta) y las filas coincidentes de la tabla "derecha" (la que se menciona después de la palabra clave JOIN).
Si no hay coincidencia en la tabla derecha para una fila específica en la tabla izquierda, la base de datos aún devuelve la fila de la tabla izquierda, pero coloca NULL en todas las columnas que provienen de la tabla derecha.
Visualización:
Tabla A (cliente) Tabla B (pago)
+----+----------+ +----+----------+
| id | nombre | | id | monto |
+----+----------+ +----+----------+
| 1 | Alice | <--------> | 1 | 10.00 | (¡Coincidencia!)
| 2 | Bob | <--------> | 1 | 15.00 | (¡Coincidencia!)
| 3 | Charlie | <--------? | NULL | (Sin coincidencia, ¡mantiene a Charlie!)
+----+----------+ +----+----------+
En este ejemplo, Charlie está incluido en los resultados a pesar de no tener pagos. El "monto" para su fila será NULL.
Sintaxis de LEFT JOIN
La sintaxis para un LEFT JOIN es idéntica a la de INNER JOIN, pero con una palabra clave diferente:
SELECT
table1.column1,
table2.column2
FROM
table1
LEFT JOIN
table2 ON table1.common_column = table2.common_column;
LEFT JOIN: Asegura que se mantengan todas las filas detable1(la tabla izquierda).ON: La condición para la coincidencia.
Nota:
LEFT JOINyLEFT OUTER JOINson lo mismo. La palabra claveOUTERes opcional.
Ejemplos Prácticos (Base de Datos Sakila)
1. Encontrando Todos los Clientes y Sus Pagos
Supongamos que queremos una lista de todos los clientes, incluidos aquellos que nunca han realizado un pago. Un INNER JOIN filtraría a los clientes sin pagos, pero un LEFT JOIN los mantiene.
SELECT
c.first_name,
c.last_name,
p.amount
FROM
customer AS c
LEFT JOIN
payment AS p ON c.customer_id = p.customer_id
ORDER BY
p.amount ASC;
Si ves filas donde amount es NULL, esos son clientes que no tienen registros de pago.
2. Identificando Inventario "Muerto"
Busquemos todas las copias de películas (inventario) y verifiquemos si alguna vez han sido alquiladas.
SELECT
i.inventory_id,
f.title,
r.rental_id
FROM
inventory AS i
JOIN
film AS f ON i.film_id = f.film_id
LEFT JOIN
rental AS r ON i.inventory_id = r.inventory_id
WHERE
r.rental_id IS NULL;
Al usar LEFT JOIN y luego filtrar por r.rental_id IS NULL, podemos encontrar artículos específicos en nuestro inventario que nunca han sido alquilados.
Consideraciones Importantes
- El Orden de las Tablas Importa: En un
LEFT JOIN, la tabla listada después deFROMes la tabla "Izquierda". Si intercambias las tablas, el resultado cambia completamente. - Manejo de NULLs: Al usar
LEFT JOIN, tu código de aplicación debe estar preparado para manejar valoresNULLen los resultados. - Filtrado: Si pones una condición en la cláusula
WHEREque hace referencia a la tabla derecha, podrías convertir accidentalmente tuLEFT JOINen unINNER JOIN(esta es una trampa común en SQL).
Conclusiones Clave de Esta Lección
- LEFT JOIN devuelve todas las filas de la tabla izquierda, independientemente de si existe una coincidencia.
- Las columnas de la tabla derecha contendrán NULL cuando no se encuentre una coincidencia.
- Es una herramienta poderosa para encontrar datos faltantes o generar listas completas.
- A diferencia de
INNER JOIN, el orden de las tablas en la consulta impacta significativamente el resultado.