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

¿Qué es FULL JOIN en SQL? Una Explicación con 4 Ejemplos

¿Qué es FULL JOIN - uno de los tipos de uniones SQL más olvidados? En este artículo, le mostraremos lo útil que puede ser FULL JOIN y le enseñaremos cómo aplicarlo a diferentes escenarios. Los cuatro ejemplos cubren algunos de los usos típicos.

Un join SQL es una construcción para combinar datos de dos o más tablas. FULL JOIN es uno de los tipos de join. Aprovechará al máximo este artículo si ya está familiarizado con las uniones SQL y su funcionamiento. Si no lo está o si necesita refrescar sus conocimientos, le recomendamos que siga nuestro curso interactivo Tipos de JOIN en SQL interactivo. Allí le esperan noventa y tres ejercicios en los que repasará los tipos de uniones y practicará el filtrado de datos mediante uniones simples y múltiples, autouniones y uniones no equitativas.

¿Qué es una FULL JOIN?

FULL JOIN o FULL OUTER JOIN (SQL acepta ambas) es una unión externa. En SQL, una unión externa es un tipo de unión que incluye filas no coincidentes de una o ambas tablas unidas; LEFT JOIN y RIGHT JOIN también son uniones externas. FULL JOIN es una unión de LEFT JOIN y RIGHT JOIN: muestra las filas coincidentes y no coincidentes de ambas tablas. Cuando los valores de una tabla no coinciden en la otra tabla, FULL JOIN devuelve NULLs. Visualmente, se puede mostrar así:

FULL JOIN en SQL

Sintaxis FULL JOIN

La sintaxis de FULL JOIN es:

SELECT …
FROM table1
FULL JOIN table2
ON table1.column = table2.column;

Como es habitual en las uniones SQL, las partes principales de la sintaxis FULL JOIN son las cláusulas JOIN y ON. La primera tabla de la cláusula FROM va seguida de la palabra clave FULL JOIN, que une la segunda tabla. La condición por la que se unen las tablas se especifica en la cláusula ON. Normalmente, las tablas se unen en función de una columna que comparten, por ejemplo, la columna id de la tabla writer y la columna writer_ID de la tabla book de la tabla. Estas dos columnas tendrían los mismos valores debido a la relación clave primaria - clave externa.

En un ejemplo sencillo, podríamos escribir este código y obtener el siguiente resultado:

Otros Tipos de Uniones en SQL

Ya hemos mencionado que FULL JOIN es sólo uno de los varios tipos de uniones en SQL. Aquí está la lista completa:

  • (INNER) JOIN
  • LEFT (OUTER) JOIN
  • RIGHT (OUTER) JOIN
  • FULL (OUTER) JOIN
  • CROSS JOIN

JOIN (o INNER JOIN) es un tipo de unión interna que devuelve sólo las filas coincidentes de las tablas unidas. Puede aprender más sobre INNER JOIN aquí.

LEFT JOIN (o LEFT OUTER JOIN) muestra todas las filas de la primera tabla (izquierda) y sólo las filas coincidentes de la segunda tabla (derecha). Si no hay filas coincidentes en la tabla derecha, los valores se muestran como NULL. Encontrará más información en nuestro artículo sobre LEFT JOIN.

RIGHT JOIN (o RIGHT OUTER JOIN) es la imagen especular de LEFT JOIN. Devuelve todas las filas de la segunda tabla (derecha) y sólo las filas coincidentes de la primera tabla (izquierda). Cuando hay filas no coincidentes en la tabla izquierda, los valores son NULL.

Ahora puede entender mejor por qué dijimos que FULL JOIN es la unión de LEFT JOIN y RIGHT JOIN. Como muestra todos los datos de las tablas izquierda y derecha y también las filas que no coinciden, es como si se usara LEFT JOIN y RIGHT JOIN al mismo tiempo.

CROSS JOIN devuelve un producto cartesiano. En otras palabras, devuelve todas las combinaciones de todas las filas de ambas tablas unidas.

Ejemplos de FULL JOIN

Pasemos ahora a los ejemplos que muestran el uso típico de FULL JOIN.

Ejemplo 1: Mostrar todos los empleados y departamentos de la empresa

Tarea: Necesita mostrar todos los empleados de una empresa, incluso si no tienen un departamento asignado. También necesita mostrar todos los departamentos, incluso si no hay empleados asignados a ellos.

Conjunto de datos: Utilizaremos dos tablas para resolver el problema. La primera tabla es department (el script está aquí), que es una lista de los departamentos de la empresa:

iddepartment_name
1IT
2Accounting
3Sales

La segunda tabla es empleados, con los datos que se muestran a continuación. El script está aquí:

idfirst_namelast_namedepartment_id
1SarahZimmerman2
2ThomasTyson1
3DanielRichardson1
4SofiaTardelli2
5MarkFitzpatrick4

Solución:

SELECT 
  first_name,
  last_name,
  department_name
FROM employees e
FULL JOIN department d
  ON e.department_id = d.id;

Explicación: El código selecciona los nombres y apellidos de los empleados y el nombre del departamento.

Podemos hacerlo porque FULL JOIN las dos tablas. Hacemos referencia a la tabla employees en FROM y le damos un alias. A continuación, hacemos referencia a la segunda tabla, departmenten FULL JOIN. Las tablas se unen en función de los ID de departamento que se encuentran en ambas tablas. Esta condición de unión se escribe en la cláusula ON.

Resultado: La salida devuelve todos los datos de ambas tablas. Hay algunas filas interesantes que necesitan elaboración.

Mark Fitzpatrick no tiene departamento. department_id valor es 5, pero no hay ningún departamento con ID 5 en la tabla department. Por lo tanto, hay un valor NULL bajo el nombre del departamento. Esto puede deberse a que es un empleado nuevo y la tabla no se actualiza con el departamento. employees y la tabla no está actualizada con los datos del departamento.

Además, la última fila muestra el departamento de Ventas, pero no el nombre del empleado. Esto indica que Ventas no tiene empleados. Nada inusual aquí, ya que nos enteramos de que los tres empleados de Ventas renunciaron recientemente a la empresa.

first_namelast_namedepartment_name
SarahZimmermanAccounting
ThomasTysonIT
DanielRichardsonIT
SofiaTardelliAccounting
MarkFitzpatrickNULL
NULLNULLSales

Ejemplo 2: Mostrar todos los clientes con el número de productos comprados y el número de productos sin ventas

Tarea: Hay una tienda de discos en Internet que vende vinilos (es decir, discos de música). Su tarea es listar todos los clientes y encontrar el número de vinilos que cada cliente compró. La salida también debe mostrar el número de vinilos que nadie ha comprado todavía.

Conjunto de datos: Trabajaremos con tres tablas. La primera es customercon el script aquí:

idfirst_namelast_name
1MarvinSimmons
2MarianneDickens
3SusanStrozzi

Puedes encontrar el script para la segunda tabla, vinyl, aquí. La tabla muestra la lista de vinilos, como puedes ver a continuación:

idartistalbum_nameprice
1Callier, TerryWhat Color is Love24.99
2Guy, BuddySweet Tea32.99
3Little SimzA Curious Tale of Trials32.99
4LaVette, BettyeScene of the Crime36.99

La tercera tabla es una tabla de unión llamada purchase. Puedes encontrar el script aquí:

idcustomer_idvinyl_idpurchase_date
1122023-01-03
2132023-01-12
3122023-02-18
4132023-03-01
5232023-03-01
6222023-04-01
7242023-05-01

Solución:

SELECT 
  first_name,
  last_name,
  COUNT (v.id) AS vinyl_count	   
FROM customer c
FULL JOIN purchase p
  ON c.id = p.customer_id
FULL JOIN vinyl v
  ON p.vinyl_id = v.id
GROUP BY first_name, last_name;

Explicación: Este es un ejemplo del uso de FULL JOIN así como de la unión de más de dos tablas.

La consulta selecciona los nombres de los clientes. A continuación, utiliza la función agregada COUNT() para hallar el número de vinilos comprados. FULL JOIN la tabla customer con la tabla purchase tabla. Esto se hace con los ID de cliente de ambas tablas.

Ahora, tenemos que unir la tercera tabla. Es sencillo: escribimos de nuevo FULL JOIN y hacemos referencia a la tabla vinyl. Ahora, puedes unirla con la tabla purchase sobre los ID de los vinilos.

Resultado: La salida muestra que hay un vinilo que nadie ha pedido todavía. Puedes reconocerlo por los NULLs.

También muestra una lista de todos los clientes y el número de vinilos que han comprado. Susan Strozzi no ha comprado nada. Marianne Dickens y Marvin Simmons compraron tres y cuatro vinilos, respectivamente.

first_namelast_namevinyl_count
NULLNULL1
SusanStrozzi0
MarianneDickens3
MarvinSimmons4

Ejemplo 3: Listar todos los pares de alumnos y las notas de los alumnos

Tarea: Usted trabaja para una plataforma de certificación SQL en línea. Ofrece varias certificaciones; cada año, hay una nueva edición de cada certificación. Encuentre todos los posibles pares estudiante-certificación y la calificación que obtuvo cada estudiante en todas las ediciones de la certificación.

Conjunto de datos: El conjunto de datos está aumentando; ahora incluye cuatro tablas. La primera tabla es student; aquí está el script. Es una lista de los estudiantes de la plataforma:

nuestros vinilos, respectivamente.

idfirst_namelast_name
1TomFrank
2MaryMaddison
3PavelKuba
4AmandaWilson

La segunda tabla es la tabla de certificados, que contiene la lista de certificados. Aquí está el script:

idcertificate_name
1Microsoft Certified: Azure Data Fundamentals
2Oracle Database SQL Certified Associate Certification
3IBM Certified Database Associate
4MySQL 5.7 Database Administrator Certification
5EDB PostgreSQL 12 Associate Certification

La siguiente tabla es una tabla de unión llamada certificate_enrollment

idstudent_idedition_idgradepass
121620FALSE
226850TRUE
3210900TRUE
412100FALSE
517500FALSE
617800TRUE
748800TRUE
. Puede encontrar el script aquí. La tabla muestra qué estudiantes se matricularon en qué certificado, junto con sus calificaciones y si aprobaron:

La última tabla es una tabla de unión llamada certificate_edition. Muestra la lista de ediciones del certificado, enlazando con la tabla certificate. El script está aquí:

idcertificate_idedition
112022
222022
332022
442022
552022
612023
722023
832023
942023
1052023

Solución:

SELECT 
  first_name,
  last_name,
  certificate_name,
  edition,
  grade
FROM student s
FULL JOIN certificate_enrollment cen
  ON s.id = cen.student_id
FULL JOIN certificate_edition ced
  ON cen.edition_id = ced.id
FULL JOIN certificate c
  ON ced.certificate_id = c.id;

Explicación: Primero seleccionamos todas las columnas relevantes de las cuatro tablas: first_name y last_name de studentcertificate_name de certificateedition de certificate_edition y grade de certificate_enrollment.

A continuación, unimos las tablas como en los ejemplos anteriores. En primer lugar, la student tabla FULL JOINed con certificate_enrollment en los ID de los alumnos.

La segunda FULL JOIN añade la tabla certificate_edition tabla para unirla con certificate_enrollment. Las tablas se unen en el ID de edición del certificado.

Ahora que hemos unido tres tablas, podemos añadir la cuarta. Hacemos referencia a la tabla certificate en FULL JOIN. La unimos con certificate_edition en el ID del certificado.

Resultado: La salida muestra exactamente lo que queremos.

Hay una lista de todos los estudiantes que recibieron un certificado, su edición y la nota que obtuvo cada estudiante. Si la nota es inferior a 700, el alumno suspendió y tuvo que repetir el examen del certificado.

Hay un estudiante que aún no se ha matriculado en ningún programa de certificación: Pavel Kuba. Además, hay cuatro ediciones del certificado sin ningún alumno matriculado.

first_namelast_namecertificate_nameeditiongrade
MaryMaddisonMicrosoft Certified: Azure Data Fundamentals2022620
MaryMaddisonMicrosoft Certified: Azure Data Fundamentals2023850
MaryMaddisonEDB PostgreSQL 12 Associate Certification2023900
TomFrankOracle Database SQL Certified Associate Certification2022100
TomFrankOracle Database SQL Certified Associate Certification2023500
TomFrankOracle Database SQL Certified Associate Certification2023800
AmandaWilsonIBM Certified Database Associate2023800
PavelKubaNULLNULLNULL
NULLNULLEDB PostgreSQL 12 Associate Certification2022NULL
NULLNULLMySQL 5.7 Database Administrator Certification2022NULL
NULLNULLIBM Certified Database Associate2022NULL
NULLNULLMySQL 5.7 Database Administrator Certification2023NULL

Ejemplo 4: Encontrar todas las parejas autor-tema y mostrar los artículos y su estado

Tarea: Usted trabaja para una empresa que contrata escritores de artículos para sus clientes. Hay una lista de escritores y temas que ofrece. Además, cada tema tiene actualmente varios artículos disponibles. Los escritores están asignados a estos artículos. Un artículo puede tener uno de estos dos estados: 'Escribiendo' (el artículo se está escribiendo) o 'Revisando' (el artículo se está revisando).

Encuentre todas las parejas escritor-tema. Además, enumere todos los artículos y su estado.

Conjunto de datos: Este conjunto de datos también consta de cuatro tablas. La primera tabla es writercon el script enlazado aquí:

idfirst_namelast_name
1VictoriaThompson
2MikeMcGill
3SkyHerrera
4JimmyGoodman

La siguiente tabla es topic. Aquí está el script:

idtopic_name
1SQL
2Python
3ML
4SQL Careers
5Python Careers

La tercera tabla es article_assignment. Vincula al escritor con el artículo y muestra el estado actual del artículo. Este es el guión:

idwriter_idarticle_idstatus
143Revising
241Writing
335Writing
438Revising
5310Revising
617Writing

La cuarta tabla relaciona el artículo con el tema. Se llama articley el script está aquí:

idarticle_titletopic_id
1What is FULL JOIN in SQL? An Explanation with 4 Examples1
2Pandas in Python2
3Supervised Learning3
4Basic SQL Interview Questions4
5Basic Python Interview Questions5
6SQL Funciones de ventana1
7Ranking Data in Python2
8Unsupervised Learning3
9Intermediate SQL Interview Questions4
10Intermediate Python Interview Questions5

Solución:

SELECT 
  first_name,
  last_name,
  topic_name,
  article_title,
  status
FROM writer w
FULL JOIN article_assignment aa
  ON w.id = aa.writer_id
FULL JOIN article a
  ON aa.article_id = a.id
FULL JOIN topic t
  ON a.topic_id = t.id;

Explicación: La consulta es similar a la anterior. Selecciona todas las columnas relevantes: el nombre del autor, el tema, el título del artículo y su estado. A continuación, une las tablas writer y article_assignment en el ID del autor mediante FULL OUTER JOIN.

Otro FULL JOIN añade la tercera tabla article y la une con el ID del artículo. Por último, la cuarta tabla se une con el ID del tema.

Resultado: Aquí hay una lista de todos los escritores, los temas, artículos y estados.

Los temas de Jimmy Goodman son ML y SQL. Sky Herrera escribe sobre carreras en Python y ML. Victoria Thompson escribe sólo sobre Python.

Mike McGill no tiene ningún artículo asignado. Además, hay un artículo sobre Python, uno sobre SQL y dos sobre SQL Career sin asignar a ningún escritor.

first_namelast_nametopic_namearticle_titlestatus
JimmyGoodmanMLSupervised LearningRevising
JimmyGoodmanSQLWhat is FULL JOIN in SQL? An Explanation with 4 ExamplesWriting
SkyHerreraPython CareersBasic Python Interview QuestionsWriting
SkyHerreraMLUnsupervised LearningRevising
SkyHerreraPython CareersIntermediate Python Interview QuestionsRevising
VictoriaThompsonPythonRanking Data in PythonWriting
MikeMcGillNULLNULLNULL
NULLNULLPythonPandas in PythonNULL
NULLNULLSQLSQL Funciones de ventanaNULL
NULLNULLSQL CareersBasic SQL Interview QuestionsNULL
NULLNULLSQL CareersIntermediate SQL Interview QuestionsNULL

No FULL JOIN, No SQL Mastery

FULL JOIN probablemente no se usa tan a menudo como JOIN o LEFT JOIN. Es un humilde join que espera hasta que lo necesites para brillar. Pero sin ella en tu repertorio, no puedes llamarte a ti mismo un maestro SQL.

Los ejemplos anteriores te han mostrado escenarios prácticos en los que necesitarás utilizar todos los datos de dos (o más) tablas. FULL JOIN te lo pone realmente fácil.

Por supuesto, necesitarás algo más de práctica, ya que la parte más crucial del uso de las uniones SQL es decidir qué unión usar. Una vez que domines esto, las uniones serán más fáciles: la sintaxis es la misma, independientemente del tipo de unión que utilices. Nuestro curso Tipos de JOIN en SQL puede ayudarle a dominar JOIN, ya que está repleto de ejercicios prácticos. Lo mismo puede decirse de nuestro artículo de práctica de uniones SQL con 12 ejemplos. Después de aprender todo esto, incluso estas preguntas de entrevista sobre SQL JOIN no serán difíciles de responder.

Ahora te toca a ti utilizar todos estos recursos para dominar FULL JOIN.