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

Cómo unir dos tablas por múltiples columnas en SQL

El JOIN de SQL es una herramienta importante para combinar información de varias tablas. La mayoría de las veces, usted estará uniendo tablas basadas en una llave primaria de una tabla y una llave foránea de otra tabla. Sin embargo, también es frecuente que necesite unir tablas por dos o más columnas. En este artículo, hablaré de por qué querrías unir tablas por varias columnas y cómo hacerlo en SQL.

Unir tablas por una sola columna no funciona en algunos escenarios. Por ejemplo, puedes encontrarte con casos en los que no hay una columna en la tabla que identifique de forma única las filas. O las tablas que desea unir pueden no tener una sola columna común para usar en la unión. En situaciones como éstas, es posible que tenga que utilizar varias columnas para unir las tablas, por ejemplo, el nombre y los apellidos, o el número de pedido y el año si la numeración del pedido se reinicia cada año.

Veamos algunos ejemplos para entender cómo funciona esto en la práctica.

Unir dos tablas en varias columnas

Imaginemos que tenemos una red de guarderías. En nuestra base de datos, tenemos las siguientes tablas:

  • studentsEn la página web de la escuela, donde tenemos información sobre cada estudiante, como el nombre, el jardín de infancia al que asistió, la clase, el año de graduación y el profesor.
  • teachers, donde tenemos el nombre y el nivel educativo de cada profesor.
  • classesEn la base de datos de la escuela, tenemos información sobre cada clase, como el nombre del jardín de infancia, la clase, el año de graduación y el nombre del aula.
students
idfirst_namelast_namekindergartengraduation_yearclassteacher_first_nameteacher_last_name
1MaryJonesSunshine2021AIsabellaLopez
2JohnSmithLove & Learn2020BMiaGonzalez
3MarkAndersonButterfly2020BSophiaStevenson
4StevenMooreButterfly2021CMariaStuart
5DianaMillerButterfly2021CMariaStuart
6AnnaDavisSunshine2021AEmmaGrey
7HellenBrownSunshine2020BOliviaTaylor
8GracyLeeLove & Learn2020ACharlotteJohnson
9SaraGarciaLove & Learn2021BJasmineHarris
10KateWilsonSunshine2019BOliviaTaylor
teachers
idfirst_namelast_nameeducation
101IsabellaLopezUndergraduate
102MariaStuartUndergraduate
103EmmaGreyGraduate
104OliviaTaylorGraduate
105CharlotteJohnsonGraduate
106MiaGonzalezUndergraduate
107SophiaStevensonUndergraduate
108JasmineHarrisUndergraduate
classes
idkindergartengraduation_yearclassclassroom
201Sunshine2019BIronman
202Butterfly2020BSun
203Love & Learn2020ALove
204Love & Learn2020BHappiness
205Sunshine2020AHulk
206Sunshine2020BSuperman
207Butterfly2021AGarden
208Butterfly2021BIsland
209Butterfly2021CSea
210Love & Learn2021ADream
211Love & Learn2021BLaugh
212Sunshine2021AIronman

Puede observar que nuestra base de datos no está perfectamente organizada. Normalmente, la tabla students incluiría claves externas como el ID del profesor y el ID de la clase en lugar de información detallada sobre los profesores y las clases correspondientes. Sin embargo, incluso con los datos almacenados de este modo, podemos unir las tablas siempre que cada una de ellas tenga un conjunto de columnas que identifique de forma exclusiva cada registro.

Es hora de hacer un par de consultas SQL.

Ejemplo 1: SQL JOIN por dos columnas

En nuestro primer ejemplo, queremos conocer el nivel educativo del profesor de cada alumno. Para ello, tenemos que combinar la información de las tablas students y teachers. Por desgracia, no tenemos la columna ID del profesor en la tabla students tabla. Sin embargo, sí tenemos el nombre y los apellidos de los profesores en ambas tablas. Mientras no tengamos profesores con nombres completos idénticos, podemos unir con seguridad estas tablas por estas dos columnas. Esta es la consulta:

SELECT s.first_name, s.last_name, s.teacher_first_name, s.teacher_last_name, t.education AS teacher_education
FROM students s
JOIN teachers t
ON s.teacher_first_name = t.first_name AND s.teacher_last_name = t.last_name;

Si necesita refrescar la sintaxis de SQL JOIN, consulte esta gran hoja de trucos de SQL JOIN.

Observe las dos condiciones en la cláusula ON ya que condicionamos que (1) el nombre de la tabla de profesores sea igual al nombre del profesor en la tabla de alumnos y (2) el apellido de la tabla de profesores sea igual al apellido del profesor en la tabla de alumnos. Como ve, para especificar dos condiciones, simplemente ponemos ambas en la cláusula ON utilizando la palabra clave AND entre ellas.

Este es el resultado:

first_namelast_nameteacher_first_nameteacher_last_nameteacher_education
MaryJonesIsabellaLopezUndergraduate
StevenMooreMariaStuartUndergraduate
DianaMillerMariaStuartUndergraduate
AnnaDavisEmmaGreyGraduate
HellenBrownOliviaTaylorGraduate
KateWilsonOliviaTaylorGraduate
JohnSmithMiaGonzalezUndergraduate
MarkAndersonSophiaStevensonUndergraduate
GracyLeeCharlotteJohnsonGraduate
SaraGarciaJasmineHarrisUndergraduate

¡Se ve bien! Ahora vemos el nivel educativo del profesor correspondiente a cada estudiante.

Para practicar la unión de tablas en SQL, consulte este curso interactivo Tipos de JOIN en SQL interactivo.

Ejemplo 2: SQL JOIN por tres columnas

En el ejemplo anterior, vimos cómo unir dos tablas por dos condiciones. Podemos tener aún más condiciones si es necesario. Veamos cómo unir tablas en SQL con tres condiciones.

Ahora queremos averiguar el nombre del aula donde ha jugado y estudiado cada alumno. La información del aula está disponible en la tabla classes tabla.

No tenemos el ID de la clase en la tabla students tabla. Sin embargo, tenemos allí tres columnas que identifican unívocamente una clase cuando se combinan: kindergarten, graduation_year, class. Las mismas columnas están presentes en la classes tabla. Por lo tanto, vamos a combinar students y classes utilizando tres columnas:

SELECT s.first_name, s.last_name, c.kindergarten, c.graduation_year, c.class, c.classroom
FROM students s
JOIN classes c
ON s.kindergarten = c.kindergarten AND s.graduation_year = c.graduation_year AND s.class = c.class;

Como puede ver, unimos las tablas usando las tres condiciones colocadas en la cláusula ON con las palabras clave AND entre ellas. Este es el resultado:

first_namelast_namekindergartengraduation_yearclassclassroom
MarkAndersonButterfly2020BSun
JohnSmithLove & Learn2020BHappiness
StevenMooreButterfly2021CSea
MaryJonesSunshine2021AIronman
GracyLeeLove & Learn2020ALove
HellenBrownSunshine2020BSuperman
DianaMillerButterfly2021CSea
AnnaDavisSunshine2021AIronman
SaraGarciaLove & Learn2021BIronman
KateWilsonSunshine2019BLaugh

¡El JOIN ha funcionado como se esperaba! Ahora tenemos el aula correspondiente a cada alumno.

Si quiere ver más ejemplos, consulte este libro de cocina sobre la unión de tablas por múltiples columnas.

¡Practiquemos Tipos de JOIN en SQL por múltiples columnas!

El SQL JOIN es una de las herramientas básicas para los analistas de datos que trabajan con SQL. Las bases de datos relacionales están construidas de tal manera que los informes analíticos suelen requerir la combinación de información de varias tablas. Se unirán tablas, a veces por una columna y otras veces por dos o más columnas.

Como ha visto, unir tablas por varias columnas es bastante sencillo en SQL. Pero si quieres adquirir confianza en el uso de SQL JOINs, practicar con conjuntos de datos del mundo real es un factor clave para el éxito.

Recomiendo empezar con este curso interactivo de Tipos de JOIN en SQL que incluye 93 retos de codificación. Cubre los tipos más comunes de uniones como JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN, y auto-uniones así como uniones no-equi.

Para obtener aún más práctica con SQL JOINs y otras herramientas básicas de SQL, considere tomar la Curso completo de SQL curso. Incluye 7 cursos interactivos que cubren las funciones estándar de SQL, los informes básicos de SQL, las funciones de ventana, las expresiones comunes de tablas, las consultas recursivas y mucho más.

Gracias por leer, y ¡feliz aprendizaje!