El operador FULL OUTER JOIN en SQL combina los resultados de un LEFT JOIN y un RIGHT JOIN: devuelve todas las filas de ambas tablas, tanto las que tienen coincidencias como las que no.
Cuando no hay correspondencia en la otra tabla, los valores de sus columnas aparecen como NULL.
👉 En otras palabras: un FULL OUTER JOIN devuelve todas las filas de ambas tablas, coincidan o no.
Sintaxis básica de FULL OUTER JOIN
SELECT columnas
FROM tablaA
FULL OUTER JOIN tablaB
ON tablaA.columna = tablaB.columna;
tablaAytablaB: las dos tablas que se combinan.ON: condición de unión.- Resultado:
- Filas que cumplen la condición: aparecen combinadas.
- Filas sin correspondencia en
tablaA: se muestran conNULLen las columnas detablaA. - Filas sin correspondencia en
tablaB: se muestran conNULLen las columnas detablaB.
Ejemplo simple
Tablas de ejemplo
clientes
| id | nombre |
|---|---|
| 1 | Ana |
| 2 | Luis |
| 3 | Carla |
pedidos
| id | cliente_id | total |
|---|---|---|
| 101 | 2 | 500 |
| 102 | 3 | 300 |
| 103 | 4 | 200 |
Consulta con FULL OUTER JOIN
SELECT c.id, c.nombre, p.id AS pedido_id, p.total
FROM clientes c
FULL OUTER JOIN pedidos p
ON c.id = p.cliente_id;
Resultado
| id | nombre | pedido_id | total |
|---|---|---|---|
| 1 | Ana | NULL | NULL |
| 2 | Luis | 101 | 500 |
| 3 | Carla | 102 | 300 |
| NULL | NULL | 103 | 200 |
👉 Se muestran todos los clientes y todos los pedidos, incluso si no hay correspondencia en la otra tabla.
FULL OUTER JOIN vs otros JOIN
- INNER JOIN: solo filas coincidentes.
- LEFT JOIN: todas las filas de la izquierda + coincidencias de la derecha.
- RIGHT JOIN: todas las filas de la derecha + coincidencias de la izquierda.
- FULL OUTER JOIN: todas las filas de ambos lados, coincidan o no.
Ejemplo visual:
INNER JOIN → intersección (A ∩ B)
LEFT JOIN → A completo + coincidencias en B
RIGHT JOIN → B completo + coincidencias en A
FULL OUTER JOIN → A ∪ B (todo A y todo B, con NULLs donde falte)
Motores de bases de datos y soporte
- PostgreSQL: soporta
FULL OUTER JOINdirectamente. - SQL Server: soporta
FULL OUTER JOIN. - Oracle: soporta
FULL OUTER JOIN. - MySQL / MariaDB: ❌ no soportan directamente
FULL OUTER JOIN. Se debe emular conUNIONdeLEFT JOINyRIGHT JOIN.
Ejemplo en MySQL:
SELECT c.id, c.nombre, p.id AS pedido_id, p.total
FROM clientes c
LEFT JOIN pedidos p ON c.id = p.cliente_id
UNION
SELECT c.id, c.nombre, p.id AS pedido_id, p.total
FROM clientes c
RIGHT JOIN pedidos p ON c.id = p.cliente_id;
Casos de uso de FULL OUTER JOIN
- Auditorías de datos: detectar filas que están en una tabla pero no en la otra.
- Comparación de catálogos: comparar listas de productos entre dos sistemas.
- Integración de datos: unir fuentes distintas para ver coincidencias y diferencias.
- Reportes consolidados: cuando se requiere un panorama completo, sin perder registros de ninguna tabla.
Ejemplos prácticos
1) Comparar productos entre dos catálogos
SELECT a.codigo, a.nombre AS en_catalogoA,
b.nombre AS en_catalogoB
FROM catalogoA a
FULL OUTER JOIN catalogoB b
ON a.codigo = b.codigo;
👉 Muestra productos que están en A, en B, o en ambos.
2) Empleados vs pagos de nómina
SELECT e.id, e.nombre, n.mes, n.monto
FROM empleados e
FULL OUTER JOIN nominas n
ON e.id = n.empleado_id;
👉 Lista empleados aunque no tengan nómina registrada y nóminas aunque el empleado no exista (inconsistencias).
3) Detectar diferencias entre tablas
SELECT a.id, b.id
FROM tablaA a
FULL OUTER JOIN tablaB b
ON a.id = b.id
WHERE a.id IS NULL OR b.id IS NULL;
👉 Devuelve filas que están solo en una tabla (útil para auditorías).
Errores comunes con FULL OUTER JOIN
- Asumir que todos los motores lo soportan
👉 MySQL no lo soporta; hay que emular conUNION. - Olvidar manejar los NULLs
👉 Al no haber coincidencia, columnas de una tabla seránNULL. Conviene usarCOALESCE.
Ejemplo:COALESCE(c.nombre, 'Cliente desconocido') - Usarlo innecesariamente
👉 En muchos casos basta conLEFT JOINoINNER JOIN. FULL OUTER JOIN puede traer demasiadas filas conNULLy confundir. - Problemas de performance
👉 En tablas grandes puede ser costoso: genera una unión de dos joins.
Buenas prácticas con FULL OUTER JOIN
- Usarlo solo cuando se necesite la unión completa de dos conjuntos.
- Manejar
NULLconCOALESCEpara resultados más claros. - En auditorías, filtrar con
WHERE a.col IS NULL OR b.col IS NULL. - En MySQL, tener una función preparada con
UNIONpara simularlo. - Evitarlo en consultas críticas de performance si un
LEFT JOINoRIGHT JOINya resuelve el problema.
Preguntas frecuentes (FAQ)
1. ¿FULL OUTER JOIN existe en MySQL?
No. Debe simularse con UNION de LEFT JOIN y RIGHT JOIN.
2. ¿Qué diferencia hay con UNION?
FULL OUTER JOIN: combina filas según una condición (ON).UNION: combina filas de consultas sin relación explícita entre columnas.
3. ¿Qué pasa si una fila está en ambas tablas?
Aparece una sola vez, unida según la condición de ON.
4. ¿Cómo puedo identificar registros sin coincidencia?
Agregando WHERE a.id IS NULL OR b.id IS NULL.
5. ¿Es costoso usar FULL OUTER JOIN?
Sí, en tablas grandes puede ser pesado. Requiere escanear ambas tablas y combinar resultados.
Conclusión
El FULL OUTER JOIN en SQL es un operador de conjuntos muy útil para obtener la visión completa de dos tablas, incluyendo coincidencias y no coincidencias.
Aunque no todos los motores lo soportan directamente, sus equivalentes (UNION de LEFT JOIN y RIGHT JOIN) permiten replicar la funcionalidad.
Se recomienda especialmente en auditorías, comparaciones de catálogos y consolidación de datos, siempre con cuidado en el manejo de NULL y la performance.
Ve comparativas de tipos de joins en JOINS (INNER/LEFT/RIGHT/FULL) y repasa términos en el Glosario SQL completo.