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
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.
-- 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:
-- 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
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.
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
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.
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