Imagina que tienes dos tablas: una lista de estudiantes y una lista de sus inscripciones a cursos. No todos los estudiantes están inscritos en cursos, y quieres ver la lista completa de todos los estudiantes, incluyendo los que por alguna razón aún no han elegido un curso. Si usas INNER JOIN solo verás a los que están inscritos, pero ¿qué pasa con el resto? Para eso existe el LEFT JOIN.
LEFT JOIN devuelve todas las filas de la tabla izquierda (la que pones primero en la consulta) y las filas coincidentes de la tabla derecha. Si no hay coincidencias, las columnas de la tabla derecha tendrán valores NULL.
Sintaxis de LEFT JOIN
SELECT
tabla1.columna1,
tabla1.columna2,
tabla2.columna1,
tabla2.columna2
FROM
tabla1 LEFT JOIN tabla2
ON
tabla1.columna_comun = tabla2.columna_comun;
tabla1— es la tabla "izquierda".tabla2— es la tabla "derecha".columna_comun— la columna común por la que se hace el join.
Ejemplo sencillo
Si la tabla students se ve así:
| student_id | name |
|---|---|
| 1 | Otto |
| 2 | Anna |
| 3 | Peter |
Y la tabla enrollments se ve así:
| enrollment_id | student_id | course |
|---|---|---|
| 1 | 1 | Matemáticas |
| 2 | 1 | Física |
| 3 | 2 | Biología |
Entonces la consulta:
SELECT
students.name,
enrollments.course
FROM
students LEFT JOIN enrollments
ON
students.student_id = enrollments.student_id;
te dará:
| name | course |
|---|---|
| Otto | Matemáticas |
| Otto | Física |
| Anna | Biología |
| Peter | NULL |
Como ves, en el resultado aparecen todos los estudiantes, incluso Peter, que todavía no se ha inscrito en ningún curso. Para Peter, en la columna course aparece NULL.
Ejemplos de uso de LEFT JOIN
Ejemplo 1: Obtener la lista de todos los estudiantes y sus cursos
Vamos con el reto: necesitamos obtener la lista completa de estudiantes junto con los cursos en los que están inscritos, si es que lo están. Si un estudiante aún no ha elegido curso, eso también debe mostrarse.
La misma consulta:
SELECT
students.name,
enrollments.course
FROM
students LEFT JOIN enrollments
ON
students.student_id = enrollments.student_id;
Resultado:
| name | course |
|---|---|
| Otto | Matemáticas |
| Otto | Física |
| Anna | Biología |
| Peter | NULL |
Este es el ejemplo clásico de uso de LEFT JOIN.
Ejemplo 2: Mostrar productos y sus ventas
Supón que tienes dos tablas:
La tabla products, que contiene todos los productos:
| product_id | product_name |
|---|---|
| 1 | Smartphone |
| 2 | Tablet |
| 3 | Portátil |
La tabla sales, que contiene los datos de ventas:
| sale_id | product_id | quantity |
|---|---|---|
| 1 | 1 | 5 |
| 2 | 1 | 3 |
| 3 | 2 | 2 |
Ahora quieres ver todos los productos y la cantidad de ventas de cada uno, incluyendo los productos que aún no se han vendido.
SELECT
products.product_name,
SUM(sales.quantity) AS total_sold
FROM
products LEFT JOIN sales
ON
products.product_id = sales.product_id
GROUP BY
products.product_name;
Resultado:
| product_name | total_sold |
|---|---|
| Smartphone | 8 |
| Tablet | 2 |
| Portátil | NULL |
Detalles y problemas al usar LEFT JOIN
¿Siempre necesitas NULL?
A veces LEFT JOIN mete un NULL donde no lo esperabas. En esos casos puedes cambiar el NULL por algo más claro usando la función COALESCE().
SELECT
students.name,
COALESCE(enrollments.course, 'Curso no elegido') AS course
FROM
students LEFT JOIN enrollments
ON
students.student_id = enrollments.student_id;
Resultado:
| name | course |
|---|---|
| Otto | Matemáticas |
| Otto | Física |
| Anna | Biología |
| Peter | Curso no elegido |
Duplicados innecesarios
Si los datos en la tabla derecha tienen registros duplicados, el resultado de la consulta tendrá más filas de las que esperabas. Fíjate bien en los datos con los que trabajas y usa DISTINCT si no quieres duplicados.
GO TO FULL VERSION