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

7 Ejemplos de SQL JOIN con explicaciones detalladas

¿Necesita unir varias tablas para obtener el conjunto de resultados necesario? El SQL JOIN es una herramienta básica pero importante que utilizan los analistas de datos que trabajan con bases de datos relacionales. Y comprendo que puede ser difícil elegir entre los miles de guías de introducción a los joins. En este artículo, me centraré en ejemplos del mundo real con explicaciones detalladas.

Introducción al JOIN

Con las bases de datos relacionales, la información que desea está a menudo almacenada en varias tablas. En tales escenarios, necesitarás unir estas tablas. Aquí es donde entra en juego el JOIN de SQL.

La cláusula JOIN en SQL se utiliza para combinar filas de varias tablas basándose en una columna relacionada entre estas tablas. Puede obtener una visión general de la herramienta SQL JOIN en este artículo introductorio.

En esta guía, quiero cubrir los tipos básicos de Tipos de JOIN en SQL pasando por varios ejemplos. Discutiré en detalle la sintaxis de cada consulta, cómo funciona, cómo construir una condición y cómo interpretar los resultados.

Para los ejemplos, utilizaremos información sobre una editorial que publica libros originales y traducidos. Nuestra base de datos contiene cuatro tablas: books, authors, editors, y translators.

books
idtitletypeauthor_ideditor_idtranslator_id
1Time to Grow Up!original1121
2Your Triptranslated152232
3Lovely Loveoriginal1424
4Dream Your Lifeoriginal1124
5Orangestranslated122531
6Your Happy Lifetranslated152233
7Applied AItranslated132334
8My Last Bookoriginal1128

authors
idfirst_namelast_name
11EllenWriter
12OlgaSavelieva
13JackSmart
14DonaldBrain
15YaoDou

editors
idfirst_namelast_name
21DanielBrown
22MarkJohnson
23MariaEvans
24CathrineRoberts
25SebastianWright
26BarbaraJones
27MatthewSmith

translators
idfirst_namelast_name
31IraDavies
32LingWeng
33KristianGreen
34RomanEdwards

Si quieres practicar la unión de tablas en SQL con muchos ejemplos, te recomiendo tomar el Tipos de JOIN en SQL curso. ¡Incluye 93 desafíos de codificación!

INNER JOIN

Comenzaremos con un INNER JOIN básico, o simplemente, JOIN. Este tipo de join se utiliza cuando queremos mostrar registros coincidentes de dos tablas.

Ejemplo 1

Digamos que queremos mostrar los títulos de los libros junto con sus autores (es decir, el nombre y el apellido del autor). Los títulos de los libros se almacenan en la tabla books y los nombres de los autores en la tabla authors tabla.

En nuestra consulta SQL, uniremos estas dos tablas haciendo coincidir la columna author_id de la tabla books y la columna id de la tabla authors:

SELECT b.id, b.title, a.first_name, a.last_name
FROM books b
INNER JOIN authors a
ON b.author_id = a.id
ORDER BY b.id;

En la sentencia SELECT, enumeramos las columnas que se mostrarán: id del libro, título del libro, nombre y apellido del autor. En la cláusula FROM, especificamos la primera tabla a unir (también denominada tabla izquierda). En la cláusula INNER JOIN, especificamos la segunda tabla a unir (también denominada tabla derecha).

A continuación, utilizamos la palabra clave ON para indicar a la base de datos qué columnas deben utilizarse para cotejar los registros (es decir, la columna author_id de la tabla books y la columna id de la tabla authors de la tabla).

Tenga en cuenta también que estamos utilizando alias para los nombres de las tablas (es decir b para books y a para authors). Asignamos los alias en las cláusulas FROM y INNER JOIN y los utilizamos en toda la consulta. Los alias de tabla reducen la escritura y hacen que la consulta sea más legible.

Este es el conjunto resultante:

idtitlefirst_namelast_name
1Time to Grow Up!EllenWriter
2Your TripYaoDou
3Lovely LoveDonaldBrain
4Dream Your LifeEllenWriter
5OrangesOlgaSavelieva
6Your Happy LifeYaoDou
7Applied AIJackSmart
8My Last BookEllenWriter

Para cada registro de la tabla de la izquierda (es decir, books), la consulta comprueba el author_id, y luego busca el mismo id en la primera columna de la tabla authors tabla. A continuación, extrae el nombre y el apellido correspondientes.

Tenga en cuenta que el orden de las tablas no importa con el INNER JOIN, o el simple JOIN. El conjunto de resultados sería exactamente el mismo si pusiéramos la tabla authors en la cláusula FROM y la tabla books en la cláusula INNER JOIN.

INNER JOIN sólo muestra los registros que están disponibles en ambas tablas. En nuestro ejemplo, todos los libros tienen un autor correspondiente y todos los autores tienen al menos un libro correspondiente. Veamos qué ocurre si algunos de los registros no coinciden.

Ejemplo 2

En nuestro segundo ejemplo, mostraremos los libros junto con sus traductores (es decir, el apellido del traductor). Sólo la mitad de nuestros libros han sido traducidos y, por tanto, tienen un traductor correspondiente. Por lo tanto, ¿cuál sería el resultado de unir las etiquetas books y translators utilizando INNER JOIN?

SELECT b.id, b.title, b.type, t.last_name AS translator
FROM books b
JOIN translators t
ON b.translator_id = t.id
ORDER BY b.id;
idtitletypetranslator
2Your TriptranslatedWeng
5OrangestranslatedDavies
6Your Happy LifetranslatedGreen
7Applied AItranslatedEdwards

La consulta da como resultado sólo los libros que han sido traducidos. He añadido la columna de tipo para que quede claro. El resto de los libros no se han podido emparejar con la tabla translators tabla y por lo tanto no se muestran. Así es como funciona INNER JOIN.

Además, tenga en cuenta que en el segundo ejemplo hemos utilizado JOIN en lugar de la palabra clave INNER JOIN. No tiene ningún impacto en el resultado porque INNER JOIN es el tipo de unión por defecto en SQL. Puede aprender sobre otros tipos de JOIN en SQL en esta guía detallada.

Bien. Ahora sabemos cómo unir tablas cuando necesitamos que sólo se muestren los registros coincidentes. Pero, ¿qué pasa si queremos mantener todos los libros en el conjunto resultante sin cortar la tabla sólo a los libros traducidos? ¡Es hora de aprender sobre las uniones externas!

LEFT JOIN

Comenzaremos nuestra visión general de las uniones OUTER con el LEFT JOIN. Debería aplicar este tipo de JOIN SQL cuando quiera mantener todos los registros de la tabla izquierda y sólo los registros coincidentes de la tabla derecha.

Ejemplo #3

Por ejemplo, digamos que queremos mostrar información sobre el autor y el traductor de cada libro (es decir, sus apellidos). También queremos mantener la información básica de cada libro (es decir, id, title, y type).

Para obtener todos estos datos, tendremos que unir tres tablas books para la información básica de los libros, authors para los apellidos de los autores, y translators para los apellidos de los traductores.

Como hemos visto en el ejemplo anterior, el uso de INNER JOIN (o de un simple JOIN) para unir la tabla translators hace que se pierdan todos los registros de los libros originales (no traducidos). Eso no es lo que queremos ahora. Así que, para mantener todos los libros en el conjunto de resultados, uniremos el books, authorsy translators utilizando la tabla LEFT JOIN.

SELECT b.id, b.title, b.type, a.last_name AS author, 
 t.last_name AS translator
FROM books b
LEFT JOIN authors a
ON b.author_id = a.id
LEFT JOIN translators t
ON b.translator_id = t.id
ORDER BY b.id;

Observe que empezamos con la tabla books en la cláusula FROM, convirtiéndola en la tabla de la izquierda. Esto es porque queremos mantener todos los registros de esta tabla. El orden de las otras tablas no importa.

En nuestra consulta, primero LEFT JOIN la tabla authors basándonos en la columna author_id de la tabla books y la columna id de la tabla authors de la tabla. A continuación, unimos la tabla translators tabla basándonos en la columna translator_id de la tabla books y la columna id de la tabla translators tabla.

Esta es la tabla resultante:

idtitletypeauthortranslator
1Time to Grow Up!originalWriterNULL
2Your TriptranslatedDouWeng
3Lovely LoveoriginalBrainNULL
4Dream Your LifeoriginalWriterNULL
5OrangestranslatedSavelievaDavies
6Your Happy LifetranslatedDouGreen
7Applied AItranslatedSmartEdwards
8My Last BookoriginalWriterNULL

¡Genial! Hemos conservado todos los libros.

Observe los valores de NULL en la columna translator. Estos valores de NULL corresponden a los registros que no coinciden en la tabla translators tabla. Estos registros corresponden a libros originales sin traductores.

Esperamos que haya comprendido la intuición que hay detrás de las LEFT JOINs. Puede aprender más sobre este tipo de JOIN de SQL en esta guía introductoria.

Bien, revisemos otro ejemplo de LEFT JOIN para consolidar el conocimiento sobre el tema.

Ejemplo #4

Esta vez, queremos mostrar la información básica del libro (es decir, ID y título) junto con los apellidos de los editores correspondientes. De nuevo, queremos mantener todos los libros en el conjunto de resultados. Entonces, ¿cuál sería la consulta?

SELECT b.id, b.title, e.last_name AS editor
FROM books b
LEFT JOIN editors e
ON b.editor_id = e.id
ORDER BY b.id;
idtitleeditor
1Time to Grow Up!Brown
2Your TripJohnson
3Lovely LoveRoberts
4Dream Your LifeRoberts
5OrangesWright
6Your Happy LifeJohnson
7Applied AIEvans
8My Last BookNULL

Bastante simple, ¿verdad? Volvemos a mantener todos los libros en el conjunto de resultados, incluido el último, que no tiene un editor correspondiente en nuestra base de datos (observe el valor NULL en la última fila).

Podemos imaginar que el editor no está presente en la tabla de nuestros editores actuales simplemente porque dejó la editorial después de editar el libro.

¿Y si tenemos algunos editores en el equipo que aún no han publicado ningún libro? Comprobémoslo con el siguiente tipo de join externo

RIGHT JOIN

RIGHT JOIN es muy similar a LEFT JOIN. Apuesto a que ha adivinado que la única diferencia es que RIGHT JOIN mantiene todos los registros de la tabla derecha, incluso si no pueden coincidir con la tabla izquierda. Si lo hizo, ¡está en lo cierto!

Ejemplo 5

Repitamos nuestro ejemplo anterior, pero esta vez, nuestra tarea será conservar todos los registros de la tabla editors tabla. Así, tendremos la misma consulta que en el ejemplo nº 4, salvo que sustituimos LEFT JOIN por RIGHT JOIN:

SELECT b.id, b.title, e.last_name AS editor
FROM books b
RIGHT JOIN editors e
ON b.editor_id = e.id
ORDER BY b.id;
idtitleeditor
1Time to Grow Up!Brown
2Your TripJohnson
3Lovely LoveRoberts
4Dream Your LifeRoberts
5OrangesWright
6Your Happy LifeJohnson
7Applied AIEvans
NULLNULLJones
NULLNULLSmith

Con sólo una palabra cambiada en la consulta, el resultado es muy diferente. Podemos ver que efectivamente tenemos dos editores(Jones y Smith) que no tienen libros correspondientes en nuestra base de datos. Parece que hay nuevas contrataciones.

Y ese no es el único cambio. Tampoco tenemos Mi último libro en el conjunto de resultados. Este registro de la tabla izquierda (es decir books) no se encontró en la tabla de la derecha (es decir editors) y no llegó al resultado final.

Los RIGHT JOINs son raramente utilizados en la práctica porque normalmente pueden ser reemplazados por los LEFT JOINs que son mucho más comunes.

Por ejemplo, en nuestro caso, podríamos tomar nuestra consulta del ejemplo 4 y simplemente intercambiar books y editors poniendo editors en la cláusula FROM, convirtiéndola en la tabla de la izquierda, y poniendo books en la cláusula LEFT JOIN, convirtiéndola en la tabla de la derecha. El resultado habría sido el mismo que el de la tabla anterior.

JOIN COMPLETO

Aquí llegamos al último tipo de join externo, que es FULL JOIN. Utilizamos FULL JOIN cuando queremos mantener todos los registros de todas las tablas, incluso los que no coinciden. Por lo tanto, es como LEFT JOIN y RIGHT JOIN combinados. Vayamos directamente a los ejemplos para ver cómo funciona en la práctica.

Ejemplo #6

Para empezar, vamos a unir de nuevo las tablas books y editors pero esta vez mantendremos todos los registros de ambas tablas. Simplemente utilizamos FULL JOIN como palabra clave de unión, dejando el resto de la consulta sin ningún cambio:

SELECT b.id, b.title, e.last_name AS editor
FROM books b
FULL JOIN editors e
ON b.editor_id = e.id
ORDER BY b.id;
idtitleeditor
1Time to Grow Up!Brown
2Your TripJohnson
3Lovely LoveRoberts
4Dream Your LifeRoberts
5OrangesWright
6Your Happy LifeJohnson
7Applied AIEvans
8My Last BookNULL
NULLNULLJones
NULLNULLSmith

Se ve muy bien. Como era de esperar, conservamos todos los libros, incluso los que no tienen un editor correspondiente. También conservamos todos los editores, incluso los que aún no tienen ningún libro correspondiente.

Tenga en cuenta que el orden de las tablas no importa con FULL JOIN. El resultado sería el mismo si intercambiáramos las tablas poniendo la tabla editors en la cláusula FROM y la tabla books en la cláusula FULL JOIN.

Ejemplo 7

En nuestro último ejemplo, queremos unir las cuatro tablas para obtener información sobre todos los libros, autores, editores y traductores en una sola tabla. Por lo tanto, utilizaremos FULL JOIN en toda nuestra consulta SQL:

SELECT b.id, b.title, a.last_name AS author, e.last_name AS editor,
    t.last_name AS translator
FROM books b
FULL JOIN authors a
ON b.author_id = a.id
FULL JOIN editors e
ON b.editor_id = e.id
FULL JOIN translators t
ON b.translator_id = t.id
ORDER BY b.id;
idtitleauthoreditortranslator
1Time to Grow Up!WriterBrownNULL
2Your TripDouJohnsonWeng
3Lovely LoveBrainRobertsNULL
4Dream Your LifeWriterRobertsNULL
5OrangesSavelievaWrightDavies
6Your Happy LifeDouJohnsonGreen
7Applied AISmartEvansEdwards
8My Last BookWriterNULLNULL
NULLNULLNULLJonesNULL
NULLNULLNULLSmithNULL

Como se ha solicitado, la tabla muestra todos los libros, autores, editores y traductores. Los registros que no coinciden tienen los valores de NULL. Esto es un gran resumen de los datos almacenados en nuestra base de datos.

¡Es hora de practicar Tipos de JOIN en SQL!

El dominio de Tipos de JOIN en SQL es uno de los requisitos clave para cualquier persona que trabaje con bases de datos relacionales. Para ayudarte a navegar por los diferentes tipos de JOINs SQL, LearnSQL.com ha desarrollado una hoja de trucos de JOINs SQL de dos páginas. Proporciona la sintaxis de los diferentes JOINs así como ejemplos.

Sin embargo, para dominar los JOINs, necesitas mucha práctica. Recomiendo comenzar con el curso interactivo Tipos de JOIN en SQL que cubre los tipos importantes de JOINs a través de docenas de ejemplos y ejercicios. Aprenda más sobre este curso en este artículo de resumen.

BONUS: Aquí están las 10 principales preguntas de la entrevista de SQL JOIN y cómo responderlas.

¡Feliz aprendizaje!