Contenido de esta guía
Qué significa OUTER JOIN
Una unión externa conserva al menos uno de los conjuntos completos. Las filas sin pareja no desaparecen: el motor las completa con NULL en las columnas del lado ausente.
OUTER JOIN no suele escribirse solo. Se elige una dirección: LEFT OUTER JOIN, RIGHT OUTER JOIN o FULL OUTER JOIN. La palabra OUTER es opcional en estas formas.
Elige qué filas conservar
| Tipo | Conserva | Ausencia representada |
|---|---|---|
LEFT JOIN | Todas las filas de la izquierda | NULL en columnas derechas |
RIGHT JOIN | Todas las filas de la derecha | NULL en columnas izquierdas |
FULL JOIN | Todas las filas de ambos lados | NULL en el lado sin pareja |
Ejemplo guiado con LEFT OUTER JOIN
Piensa primero en la pregunta. «Todos los empleados, tengan o no responsable» señala que el alias e debe quedar en el lado conservado.
La tabla empleados aparece dos veces con alias diferentes. Carmen se conserva aunque su responsable_id sea NULL.
| id | empleado | responsable |
|---|---|---|
| 1 | Carmen Soler | NULL |
| 3 | Bea Molina | Alex Ramos |
| 6 | Ernesto Cano | Carlos Peña |
SELECT e.id,
e.nombre AS empleado,
r.nombre AS responsable
FROM empleados AS e
LEFT OUTER JOIN empleados AS r
ON r.id = e.responsable_id
WHERE e.id IN (1, 3, 6)
ORDER BY e.id;Error frecuente
Confundir OUTER con una instrucción independiente
OUTER JOIN necesita una dirección. Escribe LEFT, RIGHT o FULL según el conjunto que deba sobrevivir sin coincidencia.
Otro error común es aplicar en WHERE un filtro que rechaza los NULL creados por la unión y termina comportándose como una unión interna.
Comprueba lo aprendido
Elige el tipo correcto
Necesitas listar todos los productos, incluso los que nunca aparecen en detalle_pedido. ¿Qué tabla debe ir a la izquierda y qué unión usarías?
productos.detalle_pedido.producto_id = productos.id.Solución razonada
SELECT pr.id, pr.nombre, dp.pedido_id
FROM productos AS pr
LEFT JOIN detalle_pedido AS dp
ON dp.producto_id = pr.id
ORDER BY pr.id, dp.pedido_id;productos queda en el lado conservado. Si un producto no tiene ventas, aparece una vez con pedido_id igual a NULL.
Compatibilidad entre motores
PostgreSQL y SQL Server ofrecen LEFT, RIGHT y FULL OUTER JOIN. SQLite ofrece los tres desde 3.39.0. MySQL 8.4 documenta LEFT y RIGHT, pero no un operador FULL directo. La palabra OUTER puede omitirse en las formas admitidas.
Qué debes recordar
- Una unión externa conserva filas sin coincidencia.
- LEFT, RIGHT y FULL indican qué lado se conserva.
- Las ausencias aparecen como
NULL. - Un filtro posterior puede eliminar esas filas sin querer.