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

SQL JOINs para principiantes

Probablemente ya estés familiarizado con las consultas SQL sencillas, como SELECT * FROM table. Ahora te estás preguntando qué hacer cuando tienes varias tablas y quieres unirlas. Exactamente! JOIN es la clave. En este tutorial de Tipos de JOIN en SQL para principiantes, aprenderás a conectar datos de múltiples tablas.

¿Qué es Tipos de JOIN en SQL?

Las bases de datos suelen tener más de una tabla. JOINs es una construcción SQL utilizada para unir datos de dos o más tablas. Cuando se desea utilizar columnas de dos tablas en una tabla de resultados, la forma más sencilla de hacerlo es escribir una consulta JOIN.

La sintaxis de un SQL JOIN es:

SELECT * 
FROM table1
JOIN table2
  ON table1.id1=table2.id2

Como este es un tutorial de SQL JOINs para principiantes, empecemos por lo más básico. Repasaremos los elementos individualmente.

Después de la palabra clave FROM, escribes el nombre de la primera tabla de la que quieres tomar columnas. A continuación, utiliza la palabra clave JOIN, seguida del nombre de la segunda tabla que desea utilizar.

A continuación, la sentencia ON indica a la consulta en qué columnas deben unirse los datos. (Normalmente se trata de un ID). En la sintaxis anterior, unimos las tablas usando id1 de table1 y id2 de table2. Esto se escribe como table1.id1 y table2.id2 - después del nombre de la tabla hay un punto y luego el nombre de la columna.

Conviene aclarar que las columnas en las que unimos los datos no siempre tienen la forma de ID. Tampoco es necesario que tengan el mismo nombre. Por ejemplo, es posible unir dos tablas basadas en claves llamadas orders.post_code y cities.zip_code. Como puede ver, no se trata de un ID y los nombres de las columnas de los códigos postales también son diferentes. Sin embargo, ambas columnas contienen códigos postales; se necesitan dos campos que coincidan para hacer un SQL JOIN.

INNER JOIN

Continuemos con nuestra guía Tipos de JOIN en SQL para principiantes. Veremos cómo Tipos de JOIN en SQL funcionan en un ejemplo sencillo. Supongamos que queremos averiguar qué artista ha grabado una determinada canción. En este modelo de datos básico, sólo hay dos tablas: song y artist. La tabla song contiene las columnas song_id, song_title y artist_id. La tabla artist está formada por artist_id y artist_name. Como podemos ver, artist_id está en ambas tablas; podemos usarlo para unirlas.

tab-1

El JOIN más sencillo (también llamado INNER JOIN) toma la tabla de la izquierda y hace coincidir la información de cada fila de la tabla de la derecha utilizando artist_id. Así, la primera canción, "Dancing Queen", tiene un artist_id igual a "04"; en la tabla artist, "04 " se asigna a "ABBA".

Como se puede ver en la tabla artist, no hay ningún artist_id igual a "06", que se asigna a la canción "Rolling in the Deep". En la tabla de resultados, sólo se muestran las canciones que coinciden con un artist_name. Tampoco hay ninguna canción de Michael Jackson en la tabla de resultados, ya que no existe dicha canción en la tabla song.

Recuerda que INNER JOIN selecciona todas las filas de ambas tablas siempre que haya una coincidencia entre las columnas de ambas tablas.

Este es el código:

SELECT *
FROM song
JOIN artist
  ON song.artist_id=artist.artist_id
tab-2

LEFT JOIN

El segundo tipo de join que vamos a mencionar en este tutorial de Tipos de JOIN en SQL para principiantes es el LEFT JOIN. Siempre toma la primera tabla (es decir, la tabla justo después de la palabra clave FROM ) como un todo (todos los registros de la primera tabla). Sólo toma los registros coincidentes de la segunda tabla. Si no hay información coincidente, se devuelve el valor NULL. Esto significa que no hay información disponible para ese ID en particular.

Vuelva a mirar la tabla artist. No hay ningún artist_name con un artist_id igual a "06". Por eso la canción "Rolling in the deep" no aparece en el resultado de la consulta INNER JOIN. Aunque aparece en el ejemplo de LEFT JOIN, tiene valores de NULL para artist_id y artist_name.

Esta es la sentencia SQL LEFT JOIN:

SELECT *
FROM song
LEFT JOIN artist
  ON song.artist_id=artist.artist_id
tab-3

RIGHT JOIN

El siguiente tipo de join en nuestro tutorial de Tipos de JOIN en SQL para principiantes es el RIGHT JOIN. A diferencia de LEFT JOIN, éste toma todos los registros de la segunda tabla (la que está inmediatamente después de la palabra clave JOIN ) y sólo aquellos registros de la primera tabla que tengan valores coincidentes artist_ids. En este caso, no hay canciones de Michael Jackson en la base de datos, por lo que se colocan NULLs para esos song_ids, song_titles y artist_ids. Y ahora "Rolling in the Deep" ha desaparecido, ya que en la tabla de la derecha (artist) no hay ningún artist_id igual a "06".

Este es el código:

SELECT *
FROM song
RIGHT JOIN artist
  ON song.artist_id=artist.artist_id
tab-4

FULL JOIN

El último tipo de JOIN del que vamos a hablar en nuestra guía de Tipos de JOIN en SQL para principiantes es el FULL JOIN. Es una combinación de LEFT JOIN y RIGHT JOIN, ya que toma todos los registros de ambas tablas y coloca valores de NULL donde falta la información de la tabla coincidente. En el ejemplo siguiente, puede ver NULLs para artist_id igual a "06" (¡sí, debería ser Adele!) y NULLs para las canciones de Michael Jackson con artist_id igual a "05".(¡Sí, "Billie Jean" existe, pero SQL no lo sabe!)

SELECT *
FROM song
FULL JOIN artist
  ON song.artist_id=artist.artist_id
ficha-5

Ejemplo de la vida real: Tiendas y productos

Ahora mostraremos cómo utilizar Tipos de JOIN en SQL en un ejemplo de negocio real. Esta vez, nuestro tutorial de Tipos de JOIN en SQL para principiantes utilizará un ejemplo del sector minorista. Imagina que tienes una tienda y quieres ver qué productos están agotados. También quiere comprobar si su gestor de base de datos mantiene el orden. Supongamos que la base de datos sólo tiene dos tablas: product y stock.

tab-6

Como puede ver, la primera tabla (product) tiene dos columnas: product_id y product_name. Si todo está en orden, debería haber un ID y un nombre para todos los productos que hemos vendido. La segunda tabla (stock) representa el stock actual que tenemos en la tienda - por ejemplo, hay siete artículos para el valor product_id de "100".

Fíjese bien en la columna product_id de ambas tablas. Algunos identificadores están presentes en ambas tablas(102, 105, 107); otros sólo en la izquierda(101, 103, 106); y otros sólo en la derecha(100, 104). Esta información se utilizará en los ejemplos siguientes.

Descartar la información que falta

Cuando queremos ver sólo los productos que están en stock y ya conocemos todos sus nombres, podemos utilizar una sentencia INNER JOIN. Ésta selecciona sólo los registros con un id presente en las dos tablas que queremos unir. Como resultado, obtenemos una lista de tres nombres de productos y sus cantidades. Como puede ver, puede utilizar las sentencias JOIN y INNER JOIN para hacer lo mismo. JOIN es una abreviatura de INNER JOIN. Los otros JOINtienen que ser especificados explícitamente.

UN INNER JOIN

SELECT
  product_name,
  stock.product_id,
  quantity
FROM products
INNER JOIN stock
  ON product.product_id = stock.product_id
tab-7

¿Qué productos deben ordenarse?

Supongamos que queremos comprobar qué productos están agotados y hay que volver a pedirlos. Para ello, utilizaremos un LEFT JOIN para hacer coincidir los registros de la tabla product con la tabla stock. Podemos visualizar esto como si pusiéramos la tabla product a la izquierda y la tabla stock a la derecha. A continuación, buscamos registros en ambas tablas que coincidan por product_id. Los registros que no coincidan con los campos de product_id reciben un NULL. (Véase la tabla de resultados más abajo).

UNA JUNTA IZQUIERDA

SELECT
  product_name,
  stock.product_id,
  quantity
FROM products
LEFT JOIN stock
  ON product.product_id = stock.product_id
tab-8

Así, en la tabla stock no hay valores de product_id iguales a "101", "103" o "106". Por eso la tabla muestra NULLs para el zumo de naranja, el café y los cereales. Estos son los productos que necesitamos pedir.

¿Sabemos lo que vendemos?

El papel del gestor de bases de datos es mantener todo en orden en nuestras bases de datos. Digamos que queremos verificar si está haciendo un buen trabajo. Comprobaremos si la tabla product se actualiza con nuevos productos. Para ello, utilizaremos un RIGHT JOIN.

RIGHT JOIN toma todos los registros de la tabla stock y los coloca a la derecha (tal y como sugiere RIGHT JOIN ). A continuación, muestra sólo los registros de la tabla product que tengan una coincidencia con product_id.

UN RIGHT JOIN

SELECT
  product_name,
  stock.product_id,
  quantity
FROM products
RIGHT JOIN stock
  ON product.product_id = stock.product_id
tab-9

Mostrar todo lo disponible

Para obtener una imagen completa de la situación, podemos querer ver todos los nombres de los productos y todas sus cantidades en ambas tablas. Entonces podremos ver qué productos necesitan ser reordenados y a qué product_idles falta un product_name. ¡Para esto, FULL JOIN es muy útil! Toma todos los registros de la tabla de la izquierda (product) y todos los registros de la tabla de la derecha (stock) y hace coincidir sólo los registros que tienen el mismo id (product_id); inserta un NULL a la derecha si falta un product_name o a la izquierda si no hay artículos en stock.

UNIÓN COMPLETA

SELECT
  product_name,
  stock.product_id,
  quantity
FROM products
FULL JOIN stock
  ON product.product_id = stock.product_id
tab-10

¿Quiere saber más sobre Tipos de JOIN en SQL?

Puedes encontrar más ejemplos de uso de Tipos de JOIN en SQL en nuestro canal de YouTube - We Learn SQL. Compruébalo y recuerda suscribirte.

Espero que este rápido Tipos de JOIN en SQL tutorial para principiantes te haya ayudado a entender cómo unir datos de dos tablas. Si quieres más información, te recomiendo que te inscribas en LearnSQL.es, donde podrás aprender a usar SQL (¡y mucho más!) para manejar bases de datos. Los temas se presentan de forma sencilla y muy comprensible. Pruebe hoy mismo los cursos de SQL de LearnSQL.es de forma gratuita.