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

Cómo unir 3 tablas (o más) en SQL

El uso de JOIN en SQL no está restringido a unir solo dos tablas. Puede unir 3, 4 o incluso más. Las posibilidades son ilimitadas.

Si acaba de aprender a usar JOIN en SQL, es posible que piense que su uso está limitado a dos tablas. Es algo habitual, este concepto puede ser difícil de entender, y la idea de que los JOIN pueden ser aún más complicados puede ser realmente aterradora al principio. La verdad es que, se pueden usar para unir tres tablas o, incluso, más. Observe la consulta de abajo:

SELECT
  alumno.nombre,
  alumno.apellido,
  curso.nombre
FROM alumno
JOIN curso_del_alumno
  ON alumno.id = curso_del_alumno.id_del_alumno
JOIN curso
  ON curso.id = curso_del_alumno.id_del_curso;

Lo único que hemos hecho es repetir la cláusula JOIN y, así, hemos unido tres tablas. Entraremos en más detalle en la consulta y en las tablas en la siguiente sección.

Pero, antes de continuar, le recomiendo encarecidamente que entienda bien los JOIN de SQL. El concepto que voy a explicar se basa, en gran medida, en conocimientos básicos. Si aún no está a ese nivel, consulte el curso Tipos de JOIN en SQL en LearnSQL.es.

Conocer los datos

En primer lugar, vamos a presentar algunas tablas. Este es el esquema:

En el diagrama de entidad-relación (ERD) anterior, se pueden ver las tablas, sus columnas, los tipos de datos de las columnas y las referencias entre las tablas. Por ejemplo, hay una referencia entre las tablas alumno y curso_del_alumno. Cada alumno puede estar vinculado a varias filas de la tabla curso_del_alumno. Para saber más sobre cómo entender un diagrama, lea el artículo Notación Crow's Foot del blog de Vertabelo.

Los datos de nuestro ejemplo se almacenan en cuatro tablas. En este momento, nos centraremos en las tres primeras tablas:

  • alumno - Contiene información sobre los alumnos:
    • id: El ID del alumno.
    • nombre: El nombre del alumno.
    • apellido: El apellido del alumno.
  • curso_del_alumno: Contiene información sobre cuáles son los alumnos que van a cada uno de los cursos:
    • id_del_alumno: El ID del alumno.
    • id_del_curso: El ID del curso.
  • curso: Contiene información sobre los cursos:
    • id: El ID del curso.
    • nombre: El nombre del curso.
    • id_del_profesor: El ID del profesor de ese curso.

La tabla profesor será usada después, en el curso, en consultas más avanzadas. La explicaré entonces. Mientras tanto, eche un vistazo a los datos de estas tres tablas:

alumno

idnombreapellido
1ShreyaBain
2RiannaFoster
3YosefNaylor

curso_del_alumno

id_del_alumnoid_del_curso
12
13
21
22
23
31

curso

idnombreid_del_profesor
1Database design1
2English literature2
3Python programming1

Tablas de unión

Es importante destacar que la tabla curso_del_alumno es una tabla de unión. El único propósito de esta tabla es conectar las tablas alumno y curso entre sí.

Por ejemplo, "Shreya Bain" (la alumna con id = 1) está conectada con "English literature" (el curso con id = 2) y "Python programming" (el curso con id = 3). ¿Cómo lo sabemos? Observe las dos primeras filas de la tabla curso_del_alumno. La primera fila dice que el alumno cuyo ID es igual a 1 (columna id_del_alumno) está conectado al curso cuyo ID es igual a 2 (columna id_del_curso). En la segunda fila, vemos que el alumno cuyo ID es igual a 1 está conectado al curso cuyo ID es igual a 3. Entonces, si miramos a la tabla alumno, podemos ver que el ID de Shreya Bain es 1. Por último, si miramos a la tabla curso, podemos ver que los ID de "English literature" y "Python programming" son 2 y 3, respectivamente.

La relación entre las tablas alumno y curso se denomina relación varios a varios. Un alumno puede asistir a muchos cursos (es decir, en la tabla curso_del_alumno puede haber muchas filas con el mismo id_del_alumno) y muchos alumnos pueden asistir a un curso (es decir, muchas filas de la tabla curso_del_alumno pueden tener el mismo id_del_curso).

Ya hemos visto cómo se usa la tabla de unión. Volvamos al código:

SELECT
  alumno.nombre,
  alumno.apellido,
  curso.nombre
FROM alumno
JOIN curso_del_alumno
  ON alumno.id = curso_del_alumno.id_del_alumno
JOIN curso
  ON curso.id = curso_del_alumno.id_del_curso;

Como puede ver, estamos utilizando la tabla alumno en la cláusula FROM. Luego, la unimos con la tabla curso_del_alumno y, por último, con la tabla curso. De este modo, podemos mostrar el nombre y el apellido de cada alumno junto con los cursos a los que asiste. ¿El código le sigue pareciendo confuso? No se preocupe, lo explicaremos a fondo en la siguiente sección.

El resultado de esta consulta será este:

nombreapellidonombre
ShreyaBainEnglish literature
ShreyaBainPython programming
RiannaFosterDatabase design
RiannaFosterEnglish literature
RiannaFosterPython programming
YosefNaylorDatabase design

Si quiere escribir sus propias consultas que unan varias tablas, tiene que entender bien lo que ocurre en esta consulta. Vamos a dividir en pasos nuestra consulta.

Cómo unir 3 tablas con una tabla de unión

Paso 1

El primer paso es mirar al diagrama y seleccionar las columnas que queremos mostrar. Como queremos mostrar a los alumnos junto con sus cursos, necesitaremos tres columnas: alumno.nombre, alumno.apellido y curso.nombre.

Es importante que utilicemos los nombres de las tablas cuando enumeremos las columnas. De esta manera, no nos perderemos en los diferentes nombres de las columnas y siempre sabremos a qué tabla pertenece cada columna.

En este punto, nuestra consulta debería ser así:

SELECT
  alumno.nombre,
  alumno.apellido,
  curso.nombre

Paso 2

El siguiente paso es determinar qué tablas serán necesarias para la consulta. Hay dos obvias: alumno y curso. Sin embargo, tendremos que encontrar la manera de unirlas. En el diagrama de la base de datos, vemos que curso_del_alumno es una tabla de unión para las dos. Así que, también la necesitaremos.

Paso 3

En la parte final, tendremos que unir todas las tablas. La primera tarea es elegir la tabla que irá en la cláusula FROM. En teoría, puede ser cualquiera de las tablas que estamos utilizando. A mí, personalmente, me gusta empezar con una tabla que no sea de unión. En este caso, utilizaremos la tabla alumno.

SELECT
  alumno.nombre,
  alumno.apellido,
  curso.nombre
FROM alumno

Todavía no podemos unir la tabla curso. No hay una conexión directa entre las dos tablas. Por eso, tenemos que usar la tabla curso_del_alumno. Solamente tenemos que conectar estas dos tablas entre sí con la expresión JOIN … ON …. Nuestro código va tomando forma:

SELECT
  alumno.nombre,
  alumno.apellido,
  curso.nombre
FROM alumno
JOIN curso_del_alumno
  ON alumno.id = curso_del_alumno.id_del_alumno

Antes de añadir la última tabla, deberíamos pensar en lo que ya conseguimos. Tenga en cuenta que, al escribir una cláusula JOIN, no estamos limitados a las columnas de la cláusula SELECT, ¡tenemos acceso a todas las columnas! Así que, nuestra consulta tiene el siguiente aspecto:

SELECT
  alumno.nombre,
  alumno.apellido,
  alumno.id,
  curso_del_alumno.id_del_alumno,
  curso_del_alumno.id_del_curso
FROM alumno
JOIN curso_del_alumno
  ON alumno.id = curso_del_alumno.id_del_alumno;

Esta consulta muestra casi todas las columnas que podemos utilizar para escribir la siguiente expresión JOIN. (Eliminé la columna curso_del_alumno.id, ya que no la necesitaremos). Eche un vistazo a los datos con los que estamos trabajando:

nombreapellidoidid_del_alumnoid_del_curso
ShreyaBain112
ShreyaBain113
RiannaFoster221
RiannaFoster222
RiannaFoster223
YosefNaylor331

Así se ven nuestros datos a mitad de camino. A menudo, en este punto, es bueno pensar en los datos. Es posible que usted, a veces, quiera escribir una consulta de este tipo solo para analizar las filas y columnas.

El resultado anterior muestra claramente lo que hay que hacer a continuación. Tenemos a los alumnos conectados con los ID de los cursos a los que están asistiendo. Lo único que necesitamos es añadir la información del curso. Sabemos que la columna id_del_curso está en la tabla curso_del_alumno. Tenemos que unirla con la columna id de la tabla curso. La consulta resultante será la siguiente:

SELECT
  alumno.nombre,
  alumno.apellido,
  curso.nombre
FROM alumno
JOIN curso_del_alumno
  ON alumno.id = curso_del_alumno.id_del_alumno
JOIN curso
  ON curso.id = curso_del_alumno.id_del_curso;

¡Y ya acabamos! Esta es la consulta que queríamos escribir. Importante: no se olvide de escribir el punto y coma al final del código.

En este ejemplo, analizamos cómo escribir una consulta con equi JOIN (combinaciones equivalentes). Estamos utilizando el signo de igualdad en las condiciones para la unión. Este es el tipo más común de JOIN. Sin embargo, también se pueden utilizar tipos de JOIN no equivalentes. Si no conoce este término, le recomiendo que consulte la publicación Guía ilustrada para las combinaciones no equivalentes de SQL del blog de LearnSQL.es.

Cómo unir tablas de SQL sin una tabla de unión

Cuando se unen más de dos tablas, algunas veces no se tiene una tabla de unión. Pero, antes de analizar un ejemplo de consulta para esta técnica, revisemos la última tabla de nuestro diagrama.

  • profesor: Contiene información sobre los profesores:
    • id: El ID del profesor.
    • nombre: El nombre del profesor.
    • apellido: El apellido del profesor.

Esta es la tabla profesor:

idnombreapellido
1TaylahBooker
2Sarah-LouiseBlake

Ahora, con estos datos, nos gustaría mostrar a cada profesor con sus alumnos. Cada par profesor-alumno solo debe mostrarse una vez (por ejemplo, si un alumno asiste a más de un curso con el mismo profesor, el profesor solo debe mostrarse una vez junto con el alumno en el resultado).

Esta consulta es bastante similar a la anterior. Por lo tanto, seguiremos los mismos pasos que antes.

Paso 1

Primero, seleccionamos las columnas profesor.nombre, profesor.apellido, alumno.nombre y alumno.apellido. Luego, elegimos las tablas necesarias. Esta vez, serán todas las tablas de nuestro diagrama: alumno, curso_del_alumno, curso y profesor.

Paso 2

Ahora, tenemos que unir todas las tablas. Como dije antes, podemos empezar por cualquiera de ellas, pero yo prefiero empezar por uno de los lados. La última vez pusimos la tabla alumno dentro de la cláusula FROM. Esta vez, usaremos la tabla profesor. Antes de escribir los JOIN, nuestra consulta será parecida a la siguiente: (observe que hemos usado la palabra clave DISTINCT. Ya que queremos mostrar pares distintos de profesor-alumno, esa palabra clave es extremadamente importante)

SELECT DISTINCT
  profesor.nombre,
  profesor.apellido.
  alumno.nombre,
  alumno.apellido
FROM profesor

Paso 3

Y, en este punto, para unir las tablas tenemos que hacerlo parecido a lo que hicimos en el ejemplo anterior. Solo tenemos que utilizar la cláusula JOIN una vez más. Sin embargo, antes de hacerlo, echemos un vistazo a los datos que obtenemos después de unir las tablas profesor y curso:

SELECT
  profesor.nombre,
  profesor.apellido,
  profesor.id,
  curso.id_del_profesor,
  curso.nombre,
  curso.id
FROM profesor
JOIN curso
  ON profesor.id = curso.id_del_profesor;
nombreapellidoidid_del_profesornombreid
TaylahBooker11Database design1
TaylahBooker11Python programming3
Sarah-LouiseBlake22English literature2

Podemos pensar en ella como si fuese una sola tabla. De hecho, es como la versión ampliada de la tabla curso.

Para unir dos tablas más hay que usar el mismo proceso que utilizamos anteriormente. Solo tenemos que añadir los mismos dos JOIN de antes. Solo debemos tener en cuenta que los JOIN deben escribirse en el orden correcto. Cuando se unen tablas, no se pueden usar columnas de tablas que todavía no se hayan añadido.

SELECT DISTINCT
  profesor.nombre,
  profesor.apellido.
  alumno.nombre,
  alumno.apellido
FROM profesor
JOIN curso
  ON profesor.id = curso.id_del_profesor
JOIN curso_del_alumno
  ON alumno.id = curso_del_alumno.id_del_alumno
JOIN alumno
  ON curso_del_alumno.id_del_curso = curso.id;
JOIN curso_del_alumno
  ON curso.id = curso_del_alumno.id_del_alumno
JOIN alumno
  ON curso_del_alumno.id_del_curso = alumno.id;

La parte tachada es parte del código de la primera consulta, en la que unimos tres tablas. En este caso, el código estaba mal; aunque las condiciones eran correctas, estábamos utilizando tablas que no se habían añadido. Por ejemplo, para unir la tabla curso_del_alumno utilizamos la tabla alumno, que se añade más tarde.

Debajo del código tachado, muestro el orden correcto de los JOIN. Primero unimos las tablas curso_del_alumno y curso. Luego, puedo utilizar la tabla curso_del_alumno para unir la tabla alumno. De este modo, añadimos cada tabla antes de utilizarla en una condición JOIN … ON. ¡Recuerde siempre esta importante regla!

A continuación, muestro el resultado de la consulta anterior:

nombreapellidonombreapellido
TaylahBookerShreyaBain
TaylahBookerRiannaFoster
TaylahBookerYosefNaylor
Sarah-LouiseBlakeShreyaBain
Sarah-LouiseBlakeRiannaFoster

En este caso, hemos utilizado un INNER JOIN. Esto significa que, si el profesor no tiene ningún alumno, este no aparecerá en los resultados. Además, también se puede sustituir el INNER JOIN por cualquier otro tipo de JOIN como, por ejemplo, LEFT OUTER JOIN. Si quiere leer más sobre los tipos de LEFT JOIN, consulte Cómo hacer un LEFT JOIN de varias tablas en SQL en LearnSQL.es.

Los principios básicos son importantísimos en los JOIN de 3 vías

Como puede ver, unir tres tablas en SQL no es tan difícil como parece. De hecho, puede unir tantas tablas como quiera, solo hay que seguir los mismos principios usados para unir solo dos tablas.

Le recomiendo que eche un vistazo a los datos a mitad de camino e imagine que las tablas que ya se han unido forman una sola tabla; este truco es muy útil.

Para tener éxito con los JOIN complejos, es importante entender completamente los JOIN básicos. Conocerlos bien le permitirá escribir expresiones JOIN extremadamente complejas. Y recuerde: la práctica hace al maestro. Si necesita más explicaciones o ejercicios sobre los JOIN en SQL, eche un vistazo al curso Tipos de JOIN en SQL en LearnSQL.es.