Pregunta 1¿Qué está garantizado en el resultado de employee e LEFT JOIN department d ON e.dept_id = d.dept_id?
Uniones de tablas (2) — OUTER JOIN, CROSS JOIN, auto-unión
Aprende SQL OUTER JOIN (LEFT / RIGHT / FULL), CROSS JOIN y la auto-unión practicando — con datos de empleados y departamentos que incluyen NULL, directamente en tu navegador.
OUTER JOIN — conservar las filas que existen en un solo lado
El INNER JOIN de la vez pasada devolvía solo las filas que coincidían en ambas tablas, así que los empleados sin departamento y los departamentos sin empleados desaparecían del resultado. Cuando el requisito es «quiero todos los empleados; quienes no tienen departamento pueden llevar el nombre de departamento en blanco», usas un OUTER JOIN que siempre conserva las filas de un lado.
Hay 3 tipos de OUTER JOIN según el lado que conserves: LEFT JOIN conserva todas las filas de la tabla izquierda, RIGHT JOIN conserva todas las filas de la tabla derecha, y FULL OUTER JOIN conserva todas las filas de ambas. Las columnas del lado sin coincidencia se rellenan con NULL. La consola de este curso usa SQLite, y puedes ejecutar LEFT / RIGHT / FULL tal cual. Los datos son los mismos que la vez pasada: department (6 departamentos) y employee (30 empleados).
LEFT JOIN — conservar siempre la tabla izquierda
Cuando escribes SELECT cols FROM left LEFT JOIN right ON condition, se conserva cada fila de la tabla izquierda, y si no hay fila coincidente en la tabla derecha las columnas del lado derecho pasan a NULL. LEFT JOIN es la abreviatura de LEFT OUTER JOIN, y ambos se comportan igual. Lo usas cuando quieres listar el lado principal sin dejar a nadie fuera, como «mostrar todos los empleados, y dejar el nombre del departamento en blanco para quienes no tienen departamento».
-- Conservar todos los empleados. Si no hay departamento, dept_name es NULL
SELECT e.name, e.city, d.dept_name
FROM employee e
LEFT JOIN department d
ON e.dept_id = d.dept_id
ORDER BY e.emp_id;
RIGHT JOIN y FULL OUTER JOIN
RIGHT JOIN es un LEFT JOIN con la izquierda y la derecha intercambiadas — conserva todas las filas de la tabla derecha. Cuando escribes employee e RIGHT JOIN department d ON ..., el departamento Legal sin ningún empleado se queda en el resultado, y las columnas del lado employee pasan a NULL. Es adecuado para «mostrar todos los departamentos, y mostrar los departamentos sin empleados con los campos en blanco».
FULL OUTER JOIN conserva todas las filas de ambas tablas. Las filas coincidentes se unen una al lado de la otra, las filas que existen solo a la izquierda (las 4 personas sin departamento) reciben NULL en el lado derecho, y las filas que existen solo a la derecha (el departamento Legal) reciben NULL en el lado izquierdo — todo alineado en un solo resultado.
-- RIGHT JOIN: conservar todos los departamentos. Legal tiene NULL en el lado empleado
SELECT d.dept_name, e.name
FROM employee e
RIGHT JOIN department d
ON e.dept_id = d.dept_id
ORDER BY d.dept_id;
-- FULL OUTER JOIN: conservar tanto los empleados sin departamento como los departamentos sin empleados
SELECT e.name, d.dept_name
FROM employee e
FULL OUTER JOIN department d
ON e.dept_id = d.dept_id
ORDER BY d.dept_id;
CROSS JOIN — construir todas las combinaciones
CROSS JOIN no tiene condición de unión y construye todas las combinaciones de cada fila de la tabla izquierda con cada fila de la tabla derecha. El número de filas del resultado es número de filas izquierda × número de filas derecha (el producto cartesiano). Para employee (30 filas) y department (6 filas), eso son 30 × 6 = 180 filas.
En la práctica lo usas para enumerar todas las combinaciones posibles como «todos los empleados × todos los meses» o «todas las tiendas × todos los productos», luego le unes los valores reales y rellenas con 0 las celdas sin valor real — como base de una agregación. Como es una unión sin condición, no añades ON.
-- Contar el número de combinaciones todos-empleados x todos-departamentos
SELECT count(*) AS combo_count
FROM employee e
CROSS JOIN department d;
-- Inspeccionar parte de las combinaciones (solo las parejas con el departamento Sales)
SELECT e.name, d.dept_name
FROM employee e
CROSS JOIN department d
WHERE d.dept_name = 'Sales'
ORDER BY e.emp_id;
Auto-unión — usar la misma tabla dos veces para buscar el nombre del jefe
La tabla employee tiene una columna manager_id (el número de empleado del jefe), y el jefe también es un empleado en la misma tabla employee. Cuando quieres «mostrar el nombre de cada empleado junto al nombre de su jefe», haces un JOIN de la misma tabla dos veces. Esto se llama una auto-unión.
Lo escribes como FROM employee e JOIN employee m ON e.manager_id = m.emp_id. Haces que la misma tabla aparezca dos veces con alias que separan los roles — e como «el lado empleado» y m como «el lado jefe». Los alias son obligatorios en una auto-unión; sin ellos no puedes saber qué employee es cuál. Con un INNER JOIN, los empleados sin jefe desaparecen, así que usa un LEFT JOIN si quieres listar todos los empleados.
-- Mostrar el nombre del jefe de cada empleado al lado (solo empleados que tienen jefe: INNER)
SELECT e.name AS employee, m.name AS manager
FROM employee e
JOIN employee m
ON e.manager_id = m.emp_id
ORDER BY e.emp_id;
employee es una sola tabla, pero la usas dos veces con los alias e (lado empleado) y m (lado jefe). Cotejar e.manager_id contra m.emp_id permite buscar la fila del jefe de cada empleado. Alice, que no tiene jefe, recibe NULL en el lado m con un LEFT JOIN.El NULL de un OUTER JOIN cambia de significado según dónde pongas el WHERE
Si después de un LEFT JOIN escribes una condición sobre una columna del lado derecho como WHERE right_table.column = value, NULL siempre se evalúa como falso en una comparación, así que las filas sin pareja se caen y obtienes en la práctica el mismo resultado que un INNER JOIN. Cuando quieres reducir conservando «las filas sin pareja», escribe esa condición en el lado ON, o usa WHERE right_table.key IS NULL para recoger explícitamente «las filas sin pareja». Para las comprobaciones de NULL, usa siempre IS NULL / IS NOT NULL, nunca = NULL.
Verificación de conocimientos
Responde cada pregunta una a una.
Pregunta 2¿Cuál es el número de filas del resultado cuando haces un CROSS JOIN de employee (30 filas) y department (6 filas)?
Pregunta 3¿Cómo se llama una unión que usa la misma tabla dos veces, como FROM employee e JOIN employee m ON e.manager_id = m.emp_id? ¿Y por qué son obligatorios los alias?