Entender SQL muchas veces se trata de hacer las preguntas correctas. Cuando trabajas con datos repartidos en varias tablas, la operación full outer join resulta muy útil. Aunque es bastante común en algunos sistemas de gestión de bases de datos, el concepto de FULL OUTER JOIN es un poco más complicado en MySQL. ¿Por qué? Porque no está soportado de forma nativa. Interesante, ¿no? Pero espera, ¡hay una solución alternativa!
En este tutorial vamos a explorar a detalle cómo implementar un full outer join en MySQL. Abróchate el cinturón: estamos a punto de sumergirnos en un montón de ejemplos de código.
🔖 Referencia rápida: ¿Necesitas consultar rápido todos los tipos de JOIN? Revisa nuestra guía rápida de SQL JOIN con diagramas visuales y ejemplos de código.
¿Qué es un Full Outer Join?
Antes de empezar, definamos qué es un FULL OUTER JOIN. En SQL, un full outer join combina el efecto de aplicar un left outer join y un right outer join. En otras palabras, obtiene los registros que tienen valores coincidentes en ambas tablas, además de todos los registros de ambas tablas cuyos valores no aparecen en la otra tabla.
Veamos un ejemplo. Supongamos que tenemos dos tablas, Employees y Departments.
Tabla Employees:
| id | name |
|---|---|
| 1 | Alice |
| 2 | Bob |
| 3 | Charlie |
Tabla Departments:
| id | department |
|---|---|
| 2 | HR |
| 3 | IT |
| 4 | Marketing |
Usando la consulta FULL OUTER JOIN:
SELECT * FROM Employees
FULL OUTER JOIN Departments ON Employees.id = Departments.id;
El conjunto de resultados será:
| Employees.id | Employees.name | Departments.id | Departments.department |
|---|---|---|---|
| 1 | Alice | NULL | NULL |
| 2 | Bob | 2 | HR |
| 3 | Charlie | 3 | IT |
| NULL | NULL | 4 | Marketing |
Este resultado combina todos los registros de Employees y Departments. Incluye:
- Registros con valores de
idcoincidentes en ambas tablas (Bob y Charlie). - Registros de
Employeessin un registro correspondiente enDepartments(Alice). - Registros de
Departmentssin un registro correspondiente enEmployees(Marketing).
Aunque es muy útil, esta sintaxis no está soportada directamente en MySQL. Entonces, ¿cuál es la salida? Vamos a descubrirlo.
Cómo simular un Full Outer Join en MySQL
Como mencionamos arriba, MySQL no soporta explícitamente la palabra clave FULL OUTER JOIN. Sin embargo, aún podemos obtener el resultado deseado usando una combinación de LEFT JOIN y UNION
La idea para simular un full outer join en MySQL consiste en dos pasos:
- Hacer un
LEFT JOINsobre la primera tabla para obtener todos sus registros, junto con los registros coincidentes de la segunda tabla. - Usar
UNIONpara combinar esos resultados con los de unRIGHT JOINy obtener todos los registros de la segunda tabla junto con los registros coincidentes de la primera.
Así funciona cada componente:
Left Join:
Right Join:
Ejemplo de Full Outer Join en MySQL
Aquí tienes un ejemplo de la solución alternativa usando los mismos datos de antes
SELECT
Employees.id AS Employees_id,
Employees.name,
Departments.id AS Departments_id,
Departments.department
FROM
Employees
LEFT JOIN
Departments ON Employees.id = Departments.id
UNION
SELECT
Employees.id AS Employees_id,
Employees.name,
Departments.id AS Departments_id,
Departments.department
FROM
Departments
RIGHT JOIN
Employees ON Departments.id = Employees.id;
Esta consulta tiene dos partes:
- Un
LEFT JOINpara obtener todos los registros de la tablaEmployeesy los registros coincidentes de la tablaDepartments. - Un
RIGHT JOINpara obtener todos los registros de la tablaDepartmentsy los registros coincidentes de la tablaEmployees.
UNION combina los resultados de estas dos consultas y elimina las filas duplicadas.
Con las mismas tablas de ejemplo, el conjunto de resultados será:
| Employees_id | name | Departments_id | department |
|---|---|---|---|
| 1 | Alice | NULL | NULL |
| 2 | Bob | 2 | HR |
| 3 | Charlie | 3 | IT |
| NULL | NULL | 4 | Marketing |
Este resultado, igual que el FULL OUTER JOIN en SQL, combina todos los registros de Employees y Departments.
UNION filtra los duplicados automáticamente
En el caso concreto de nuestro ejemplo con las tablas Employees y Departments, el UNION que se usa en la solución alternativa de MySQL para un FULL OUTER JOIN no generará duplicados. Esto se debe a que el operador UNION elimina automáticamente las filas duplicadas de su conjunto de resultados.
Para que quede claro, veamos cómo funciona UNION en este contexto:
-
La primera parte de la consulta (el
LEFT JOIN) obtiene todos los registros de la tabla Employees y los registros coincidentes de la tabla Departments. Esto incluye filas con valores de id coincidentes en ambas tablas y filas de Employees sin coincidencia en Departments. -
La segunda parte de la consulta (el
RIGHT JOIN) obtiene todos los registros de la tabla Departments y los registros coincidentes de la tabla Employees. Esto incluye filas con valores de id coincidentes en ambas tablas y filas de Departments sin coincidencia en Employees.
Como UNION elimina los duplicados, las filas con valores de id coincidentes (las que aparecerían tanto en los resultados del LEFT JOIN como del RIGHT JOIN) solo aparecerán una vez en el resultado final.
En resumen, usar UNION en este contexto garantiza que cada combinación única de datos de Employees y Departments aparezca solo una vez en el conjunto de resultados, imitando así el comportamiento de un FULL OUTER JOIN sin duplicados.
Practica en Beekeeper Studio
Espero que este tutorial de full outer join en MySQL te haya sido útil. En próximas publicaciones seguiremos explorando otras funciones avanzadas de MySQL, compartiendo más ejemplos de código y profundizando en por qué y cómo funcionan. Mientras tanto, sigue practicando tus habilidades de SQL, idealmente usando Beekeeper Studio.
Beekeeper Studio es un cliente de bases de datos gratuito y de código abierto
La mejor herramienta de consultas y edición de SQL que he usado. Tiene todo lo que necesito para administrar mi base de datos. - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studio es rápido, intuitivo y fácil de usar. Es compatible con muchísimas bases de datos y funciona de maravilla en Windows, Mac y Linux.
Lo que dicen los usuarios de Beekeeper Studio
"Beekeeper Studio reemplazó por completo mi antiguo flujo de trabajo con SQL. Es rápido, intuitivo y hace que trabajar con bases de datos vuelva a ser agradable."
"He probado muchas GUI de bases de datos, pero Beekeeper logra el equilibrio perfecto entre funciones y simplicidad. Simplemente funciona."