Saltar al contenido principal
eLearner.app
Módulo 3 · Lección 2 de 410/57 en el curso~10 min
Lecciones del módulo (2/4)

Mantener todo a la izquierda: LEFT JOIN

El INNER JOIN de la lección anterior tiene un efecto secundario importante: elimina filas que no coinciden. Si un empleado no tiene departamento (department_id es NULL), desaparecen del resultado.

A veces eso es lo que quieres. Sin embargo, a menudo no lo es: en un informe de recursos humanos es esencial ver a todos los empleados, incluidos aquellos que no tienen un departamento, y saber quiénes son. Para eso está LEFT JOIN (en su totalidad, LEFT OUTER JOIN).

Cómo funciona

SQL
SELECT columns
FROM   table_a
LEFT JOIN table_b ON table_a.x = table_b.y;

Leer en inglés: "mantener todas las filas de table_a; para cada una intenta adjunte una fila de table_b; si no hay ninguna coincidencia, complete las columnas de CÓDIGOPH2 con CÓDIGOPH3".

La palabra clave es LEFT: significa "tabla izquierda", es decir la que está escrita después de FROM. Todas sus filas sobreviven, siempre.

SQL
-- All employees, including those without a department:
SELECT e.first_name,
       e.last_name,
       d.name AS dipartimento
FROM   employees   AS e
LEFT JOIN departments AS d ON e.department_id = d.id;

En nuestro conjunto de datos, esta consulta devuelve 10 filas (un empleado cada una). andrea Costa, que tiene department_id = NULL, aparece con dipartimento = NULL en lugar de desaparecer.

Encontrar las filas "no coincidentes"

Una consecuencia muy útil: filtrando con IS NULL en una columna del En la tabla de la derecha encontrará exactamente las filas sin coincidencias:

SQL
-- Orphan employees: no department assigned
SELECT e.first_name, e.last_name
FROM   employees   AS e
LEFT JOIN departments AS d ON e.department_id = d.id
WHERE  d.id IS NULL;

Este truco se usa todo el tiempo en el mundo real: "encuéntrame pedidos sin cliente", "productos sin reseñas", "usuarios que nunca han iniciado sesión en".

Pruébalo

Ejercicio#sql.m3.l2.e1
Intentos: 0Cargando...

Devuelve el nombre (first_name) y apellido (last_name) de los empleados que NO tienen un departamento asignado. Una o más filas, dos columnas.

Cargando editor...
Mostrar pista

Complete WHERE con d.id IS NULL: desea las filas donde LEFT JOIN no encontró un departamento coincidente.

Solución disponible después de 3 intentos

Ejercicio de revisión

Ejercicio#sql.m3.l2.e2
Intentos: 0Cargando...

Enumere todos los departamentos (departamentos.nombre) y junto a ellos el número de empleados, incluidos también los departamentos sin empleados (muestre 0 para aquellos). Sugerencia: comience desde los departamentos y realice una UNIÓN IZQUIERDA con los empleados, luego GRUPO POR + CONTEO.

Cargando editor...
Mostrar pista

Utilice COUNT(e.id) (no COUNT(*)) para contar 0 cuando no haya coincidencias: COUNT(*) contaría 1 debido a la fila LEFT JOIN con NULL.

Solución disponible después de 3 intentos