Volver a la lista de artículos Artículos
Lectura de 8 minutos

Qué es el FULL JOIN y cuándo utilizarlo

Aprenda sobre el FULL JOIN, cómo implementarlo, cómo se compara con los otros tipos de Tipos de JOIN en SQL, y algunos de sus casos de uso únicos.

Antes de hablar de los FULL JOINs, recapitulemos rápidamente lo que es un SQL JOIN. En esencia, un JOIN combina datos de dos o más tablas dentro de una base de datos. Las tablas suelen estar vinculadas entre sí utilizando identificadores únicos en cada tabla, es decir, claves primarias y foráneas.

Para demostrar un simple SQL JOIN -también conocido como INNER JOIN - en acción, consideremos las consultas Products y OrderDetails de la conocida base de datos de ejemplo Northwind. La tabla Products contiene una lista de todos los productos y la tabla OrderDetails contiene una lista de todos los pedidos recientes.

PRODUCTS
ProductIDProductNameSupplierIDCategoryIDUnitPrice
1Chais1110 boxes x 20 bags18
2Chang1124 - 12 oz bottles19
3Aniseed Syrup1212 - 550 ml bottles10
..................

ORDERDETAILS
OrderDetaiIDOrderIDProductIDQuantity
1102481112
2102484210
310248725
............

Esta es la consulta:

SELECT 
Products.ProductName, OrderDetails.OrderID, OrderDetails.Quantity
FROM Products
JOIN OrderDetails 
ON Products.ProductID=OrderDetails.ProductID
ORDER BY Quantity Desc;

Y el resultado:

ProductNameOrderIDQuantity
Pâté chinois10398120
Steeleye Stout10286100
Sirop d'érable1044090

El ejemplo anterior utiliza ProductID (que está disponible en ambas tablas) como clave para unir las dos tablas y mostrar cada pedido ordenado de forma descendente por Quantity. Tenga en cuenta que un simple JOIN como el anterior sólo devuelve las filas coincidentes de las dos tablas. En este caso, los resultados sólo incluirán los productos y pedidos recientes que estén vinculados a un ProductID válido.

JOIN COMPLETO

FULL JOIN: una introducción

A diferencia de INNER JOIN, un FULL JOIN devuelve todas las filas de ambas tablas unidas, tengan o no una fila coincidente. Por lo tanto, un FULL JOIN también se denomina FULL OUTER JOIN. Un FULL JOIN devuelve las filas no coincidentes de ambas tablas, así como el solapamiento entre ellas. Cuando no existen filas coincidentes para una fila de la tabla izquierda, las columnas de la tabla derecha tendrán NULLs para esos registros. Del mismo modo, cuando no existen filas que coincidan con una fila de la tabla derecha, las columnas de la tabla izquierda tendrán NULLs.

Para demostrar la diferencia entre un simple SQL JOIN y un FULL OUTER JOIN, consideremos el Projects y Employees como se muestra a continuación. La tabla Projects contiene una lista de todos los proyectos emprendidos por la empresa (tanto los internos como los subcontratados), mientras que la tabla Employees contiene una lista de todos los empleados actuales y especifica si participan en algún proyecto de la empresa.

PROJECTS
ProjectIDProjectNameCostYTDBusinessUnit
1CRM Upgrade45640Customer Relations
2Cybersecurity Protocol Implementation80200Cybersecurity
3HQ Office Renovations145000Facilities
4ERP Integration110000Corporate
5Database Stack Upgrade25000Engineering
............
15Automated QA10000Engineering

EMPLOYEES
EmployeeIDEmployeeNameProjectIDStartDateBusinessUnit
001Albert Ross32012-02-11Facilities
002Hummer BairdNULL2012-02-11Corporate
003Matthias Dias152012-07-15Engineering
004Al Cooper12014-04-15Customer Relations
005Macron RalfNULL2014-04-15Legal
...............
025Hamza ImranNULL2020-07-11Engineering

Si hiciéramos JOINs entre estas dos tablas haciendo coincidir las tablas a través de ProjectID como clave primaria, los resultados de un simple INNER JOIN y de un FULL OUTER JOIN serían muy diferentes. Un INNER JOIN daría como resultado una tabla que contiene sólo los resultados en los que hay una coincidencia entre las dos entradas correspondientes en ambas tablas. El resultado de INNER JOIN contiene los nombres de los empleados y los nombres de los proyectos correspondientes:

EmployeeNameProjectName
Albert RossHQ Office Renovations
Matthias DiasAutomated QA
Al CooperCRM Upgrade

En cambio, un FULL OUTER JOIN dará salida a los datos de ambas tablas, independientemente de que haya una coincidencia en la otra tabla:

EmployeeNameProjectName
Albert RossHQ Office Renovations
Hummer BairdNULL
Matthias DiasAutomated QA
Al CooperCRM Upgrade
.......
Hamza ImranNULL
NULLERP Integration

El resultado de FULL JOIN contiene todos los nombres de los empleados, independientemente de que estén asignados a un proyecto, y todos los nombres de los proyectos, aunque no haya empleados asignados a ese proyecto.

Sintaxis del FULL JOIN

La sintaxis básica de un FULL JOIN es similar a la de otros tipos de JOIN:

SELECT 
	left_table.column1, right_table.column2,...
FROM left_table
FULL OUTER JOIN right_table 
ON left_table.key = right_table.key;

La palabra clave OUTER es opcional y puede omitirse.

Ejemplo

Ahora, repasemos el ejemplo de FULL OUTER JOIN que muestra tanto EmployeeName como ProjectName. Aquí está la consulta:

SELECT 
Employees.EmployeeName, Projects.ProjectName
FROM Employees
FULL OUTER JOIN Projects 
ON Employees.ProjectID=Projects.ProjectID
ORDER BY EmployeeID;

Y el resultado:

EmployeeNameProjectName
Albert RossHQ Office Renovations
Hummer BairdNULL
Matthias DiasAutomated QA
Al CooperCRM Upgrade
.......
Hamza ImranNULL
NULLERP Integration

En la tabla de resultados, vemos que en FULL JOIN también se obtienen resultados NULL tanto en el Projects y Employees aunque no haya habido coincidencias en la otra tabla. Los NULL en la columna ProjectName indican que el empleado no está asignado específicamente a ningún proyecto y que probablemente desempeña otras funciones en la empresa. Por otro lado, un valor NULL en la columna EmployeeName sugiere que el proyecto específico es probablemente subcontratado y no gestionado directamente por ningún empleado de la empresa. Por otra parte, un valor NULL también podría indicar un posible error o una eliminación involuntaria de datos en la base de datos o en el sistema. (Hablaremos de esto más adelante).

Es bueno tener en cuenta que algunas bases de datos, como MySQL, no soportan las uniones completas. En ese caso, puede utilizar el operador UNION ALL para combinar los datos LEFT JOIN y RIGHT JOIN.

Nuestro artículo anterior sobre Tipos de JOIN en SQL tiene algunos ejemplos más que puede examinar. Nuestro curso Tipos de JOIN en SQL curso también ofrece amplios ejemplos de FULL JOINs e incluye ejercicios prácticos para pulir tus conocimientos.

Casos de uso de FULL JOIN

En comparación con los otros tipos de Tipos de JOIN en SQL, es probable que utilice FULL JOIN con menos frecuencia. Dicho esto, es una herramienta muy útil para algunas situaciones únicas. Algunos de sus casos de uso son

  • Recuperar todos los registros de ambas tablas, haya o no coincidencia. Este es el ejemplo que vimos anteriormente.
  • Para encontrar datos no coincidentes o huérfanos de ambas tablas. Un registro huérfano es un registro cuyo valor de clave externa hace referencia a un valor de clave primaria inexistente; esto suele ocurrir en sistemas de rápido crecimiento o muy antiguos.
  • Ejecutar informes de excepción. Se trata de una forma de análisis de datos que compara un conjunto de datos con un conjunto de datos base deseado/esperado y destaca los elementos que no coinciden.

Aunque la aplicación de los FULL JOINs es bastante única, son una gran manera de encontrar y diagnosticar posibles problemas de integridad de los datos.

Tipos de JOINs: Recapitulemos

Como hemos mencionado anteriormente, hay algunos tipos más de JOINs.

Un INNER JOIN devuelve filas cuando la condición JOIN se satisface tanto en la tabla izquierda como en la derecha. En otras palabras, devuelve sólo los registros coincidentes de las tablas. Este es el tipo más común de SQL JOIN y es el predeterminado cuando no se ha especificado el tipo de JOIN.

Un OUTER JOIN devuelve todas las filas de una tabla y algunas o todas las filas de otra tabla (dependiendo del tipo de OUTER JOIN). Además de FULL OUTER JOIN, existen otros dos tipos:

  • A LEFT OUTER JOIN devuelve todas las filas de la tabla de la izquierda, incluso si no se encuentran filas coincidentes en la tabla de la derecha. Si no hay registros coincidentes en la tabla derecha, la consulta devolverá valores NULL para esas columnas.
  • Un RIGHT OUTER JOIN devuelve todas las filas de la tabla correcta. Si no hay registros que coincidan en la tabla izquierda, se devuelven valores NULL para esas columnas - lo contrario de un LEFT JOIN.

Un CROSS JOIN (también llamado JOIN cartesiano) devuelve todas las combinaciones posibles de filas de las tablas que se han unido. Como devuelve todas las combinaciones posibles, es el único tipo de JOIN que no necesita una condición JOIN y, por tanto, no requiere una cláusula ON.

Para una visión más detallada de cada uno de los tipos de JOIN, consulte el artículo Explicación de los tipos de JOIN de SQL. Además, nuestro Tipos de JOIN en SQL curso cubre todos los diferentes tipos y casos de uso de los JOINs en gran detalle. También entra en temas más avanzados, como los JOINs no equitativos y los JOINs múltiples.

Los JOINs son una de las características más fundamentales y utilizadas de SQL y una parte esencial de la caja de herramientas de cualquier usuario de SQL. También aparecen en las preguntas más comunes de las entrevistas; consulte nuestro artículo Las 10 principales preguntas de la entrevista sobre JOIN de SQL y cómo responderlas para obtener consejos útiles.

Aumente su conocimiento de los JOINs completos de SQL

En este tutorial, ha aprendido los detalles de SQL FULL JOINs y sus principales casos de uso para diagnosticar la integridad de los datos. También ha visto una breve comparación entre FULL JOINs y los otros tipos de JOINs.

Para realmente tener un conocimiento de FULL JOINs, necesitas sumergirte en la parte profunda, practicar algunos ejercicios, y ser desafiado. Te recomiendo que pruebes nuestro curso Tipos de JOIN en SQL para pasar al siguiente nivel de esta importantísima función de SQL.