FULL OUTER JOIN en SQL: qué es, cómo se usa y ejemplos prácticos

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;
  • tablaA y tablaB: 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 con NULL en las columnas de tablaA.
    • Filas sin correspondencia en tablaB: se muestran con NULL en las columnas de tablaB.

Ejemplo simple

Tablas de ejemplo

clientes

idnombre
1Ana
2Luis
3Carla

pedidos

idcliente_idtotal
1012500
1023300
1034200

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

idnombrepedido_idtotal
1AnaNULLNULL
2Luis101500
3Carla102300
NULLNULL103200

👉 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 JOIN directamente.
  • SQL Server: soporta FULL OUTER JOIN.
  • Oracle: soporta FULL OUTER JOIN.
  • MySQL / MariaDB: ❌ no soportan directamente FULL OUTER JOIN. Se debe emular con UNION de LEFT JOIN y RIGHT 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

  1. Auditorías de datos: detectar filas que están en una tabla pero no en la otra.
  2. Comparación de catálogos: comparar listas de productos entre dos sistemas.
  3. Integración de datos: unir fuentes distintas para ver coincidencias y diferencias.
  4. 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

  1. Asumir que todos los motores lo soportan
    👉 MySQL no lo soporta; hay que emular con UNION.
  2. Olvidar manejar los NULLs
    👉 Al no haber coincidencia, columnas de una tabla serán NULL. Conviene usar COALESCE.
    Ejemplo: COALESCE(c.nombre, 'Cliente desconocido')
  3. Usarlo innecesariamente
    👉 En muchos casos basta con LEFT JOIN o INNER JOIN. FULL OUTER JOIN puede traer demasiadas filas con NULL y confundir.
  4. 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 NULL con COALESCE para 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 UNION para simularlo.
  • Evitarlo en consultas críticas de performance si un LEFT JOIN o RIGHT JOIN ya 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.

Scroll al inicio