25th Jul 2022 Lectura de 11 minutos Cómo unir 3 tablas (o más) en SQL Kamil Bladoszewski SQL aprender SQL JOIN Índice Conocer los datos Tablas de unión Cómo unir 3 tablas con una tabla de unión Paso 1 Paso 2 Paso 3 Cómo unir tablas de SQL sin una tabla de unión Paso 1 Paso 2 Paso 3 Los principios básicos son importantísimos en los JOIN de 3 vías 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. Tags: SQL aprender SQL JOIN