JOIN es un operador que sirve para combinar datos de varias tablas que comparten una clave común.
SQL (Structured Query Language, o «Lenguaje de Consulta Estructurado») se creó para trabajar con bases de datos relacionales. En estas bases de datos, los datos se presentan en forma de tablas. Las dependencias entre varias tablas se establecen mediante columnas de enlace o columnas relacionales.
Cuando se solicitan datos de una sola tabla, no es necesaria la interacción con las columnas de enlace. Pero si necesitas agregar datos de varias tablas, debes describir las reglas: cómo se vincularán las filas en función de los valores de las columnas de enlace. Aquí es donde entra en juego el operador JOIN.
¿Qué es el operador JOIN en SQL?
JOIN es un operador que se utiliza para combinar filas de dos o más tablas basándose en una columna de enlace común entre ellas. A dicha columna también se la conoce como clave.
Para comprender los fundamentos de SQL, puedes inscribirte en el curso «SQL». Aprenderás a crear tablas y a elaborar consultas para el análisis. Descubrirás cómo conectar y procesar varias tablas y utilizar funciones de ventana.
Supongamos que tenemos una tabla de pedidos (Orders):
OrderID | CustomerID | OrderDate |
---|---|---|
304101 | 21 | 10-05-2021 |
304102 | 34 | 20-06-2021 |
304103 | 22 | 25-07-2021 |
Y una tabla de clientes (Customers):
CustomerID | CustomerName | ContactName |
---|---|---|
21 | Servicios Melódicos | Iván López |
22 | Astas y Pezuñas | Sebastián Ruiz |
23 | Gestión Raíz | Pedro Martínez |
La columna CustomerID
en la tabla Orders se corresponde con la columna CustomerID
en la tabla Customers. Es decir, es la columna de enlace de las dos tablas. Para saber cuándo, qué cliente y qué pedido realizó, puedes elaborar la siguiente consulta:
SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
JOIN Customers
ON Orders.CustomerID = Customers.CustomerID;
El resultado de la consulta será:
OrderID | CustomerName | OrderDate |
---|---|---|
304101 | Servicios Melódicos | 10-05-2021 |
304103 | Astas y Pezuñas | 25-07-2021 |
Sintaxis general del operador JOIN:
JOIN <Nombre de la tabla para unir> ON <Condición de unión basada en las columnas de enlace>
También puedes unir más de dos tablas: añade otro operador JOIN a la consulta. Por ejemplo, además de las dos tablas anteriores, tenemos una tabla de vendedores (Managers):
OrderID | ManagerName | ContactDate |
---|---|---|
304101 | Arturo López | 05-05-2021 |
304102 | Eduardo Ortiz | 15-06-2021 |
304103 | Eugenio Sánchez | 20-07-2021 |
La tabla de vendedores está relacionada con la tabla de pedidos (Orders) mediante la columna OrderID
. Para obtener, además de la consulta anterior, qué vendedor atendió el pedido, elabora la siguiente consulta:
SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate, Managers.ManagerName
FROM Orders
JOIN Customers
ON Orders.CustomerID = Customers.CustomerID
JOIN Managers
ON Orders.OrderId = Managers.OrderId
Resultado:
OrderID | CustomerName | OrderDate | ManagerName |
---|---|---|---|
304101 | Servicios Melódicos | 10-05-2021 | Arturo López |
304103 | Astas y Pezuñas | 25-07-2021 | Eugenio Sánchez |
Nuestro ponente te contará más en el vídeo.
Unión interna (INNER JOIN)
Si utilizas el operador INNER JOIN
, solo aparecerán en el resultado de la consulta aquellas entradas que cumplan la condición de unión. Otra condición es que las entradas deben estar en ambas tablas. En el resultado final del ejemplo anterior no aparecen las entradas con CustomerID
=23 y OrderID
=304102: no hay correspondencia para ellas en las tablas.
Sintaxis general de la consulta INNER JOIN
:
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;
La palabra INNER
en la consulta se puede omitir; en ese caso, la sintaxis general de la consulta será la siguiente:
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;
Uniones externas (OUTER JOIN)
Si utilizas una unión externa, el resultado de la consulta incluirá no solo las entradas con coincidencias en ambas tablas, sino también las entradas de una de las tablas por completo. En esto se diferencia la unión externa de la interna.
La indicación de la tabla de la que se deben seleccionar todas las entradas sin filtrar se denomina tipo de unión o dirección de la unión (según se trate de una unión izquierda o derecha).
LEFT OUTER JOIN / LEFT JOIN
En el resultado final de esta unión aparecerán todas las entradas de la tabla de la izquierda (la primera), incluso si no hay ninguna coincidencia con la tabla de la derecha. Además, se incluirán las entradas de la segunda tabla que cumplan la condición de unión.
Sintaxis:
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;
Ejemplo:
Tabla Orders:
OrderID | CustomerID | OrderDate |
---|---|---|
304101 | 21 | 10-05-2021 |
304102 | 34 | 20-06-2021 |
304103 | 22 | 25-07-2021 |
Tabla Customers:
CustomerID | CustomerName | ContactName |
---|---|---|
21 | Servicios Melódicos | Iván López |
22 | Astas y Pezuñas | Sebastián Ruiz |
23 | Gestión Raíz | Pedro Martínez |
Consulta:
SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
LEFT JOIN Customers
ON Orders.CustomerID=Customers.CustomerID;
Resultado:
OrderID | CustomerName | OrderDate |
---|---|---|
304101 | Servicios Melódicos | 10-05-2021 |
304102 | NULL | 20-06-2021 |
304103 | Astas y Pezuñas | 25-07-2021 |
He mantenido la traducción exacta y ajustado los nombres según tu solicitud. Si necesitas más cambios, avísame.
RIGHT OUTER JOIN / RIGHT JOIN
En el resultado final de esta unión aparecerán todas las entradas de la tabla de la derecha (la segunda), incluso si no hay ninguna coincidencia con la tabla de la izquierda. Además, se incluirán las entradas de la primera tabla que cumplan la condición de unión.
Sintaxis:
SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;
Ejemplo:
Tabla Orders:
OrderID | CustomerID | OrderDate |
---|---|---|
304101 | 21 | 10-05-2021 |
304102 | 34 | 20-06-2021 |
304103 | 22 | 25-07-2021 |
Tabla Customers:
CustomerID | CustomerName | ContactName |
---|---|---|
21 | Servicios Melódicos | Iván López |
22 | Astas y Pezuñas | Sebastián Ruiz |
23 | Gestión Raíz | Pedro Martínez |
Consulta:
SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
RIGHT JOIN Customers
ON Orders.CustomerID = Customers.CustomerID;
Resultado:
OrderID | CustomerName | OrderDate |
---|---|---|
304101 | Servicios Melódicos | 10-05-2021 |
null | Gestión Raíz | null |
304103 | Astas y Pezuñas | 25-07-2021 |
FULL OUTER JOIN / FULL JOIN
En el resultado final de esta unión aparecerán todas las entradas de ambas tablas, independientemente de si se cumple la condición de unión o no. Esto incluye las filas de ambas tablas que no tienen correspondencia en la otra.
Sintaxis:
SELECT column_name(s)
FROM table1
FULL JOIN table2
ON table1.column_name = table2.column_name;
Ejemplo:
Tabla Orders
OrderID | CustomerID | OrderDate |
---|---|---|
304101 | 21 | 10-05-2021 |
304102 | 34 | 20-06-2021 |
304103 | 22 | 25-07-2021 |
Tabla Customers:
CustomerID | CustomerName | ContactName |
---|---|---|
21 | Servicios Melódicos | Iván López |
22 | Astas y Pezuñas | Sebastián Ruiz |
23 | Gestión Raíz | Pedro Martínez |
Consulta:
SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
FULL JOIN Customers
ON Orders.CustomerID = Customers.CustomerID;
Resultado:
OrderID | CustomerName | OrderDate |
---|---|---|
304101 | Servicios Melódicos | 10-05-2021 |
304102 | null | 20-06-2021 |
304103 | Astas y Pezuñas | 25-07-2021 |
null | Gestión Raíz | null |
Unión cruzada (CROSS JOIN)
Este operador se diferencia de los operadores de unión anteriores: no es necesario especificar una condición de unión (ON table1.column_name = table2.column_name
). Las entradas en la tabla con los resultados son el resultado de la combinación de cada entrada de la tabla de la izquierda con las entradas de la tabla de la derecha. A esta acción se la denomina producto cartesiano.
Sintaxis:
SELECT column_name(s)
FROM table1
CROSS JOIN table2;
Ejemplo:
Tabla Orders:
OrderID | CustomerID | OrderDate |
---|---|---|
304101 | 21 | 10-05-2021 |
304102 | 34 | 20-06-2021 |
304103 | 22 | 25-07-2021 |
Tabla Customers:
CustomerID | CustomerName | ContactName |
---|---|---|
21 | Servicios Melódicos | Iván López |
22 | Astas y Pezuñas | Sebastián Ruiz |
23 | Gestión Raíz | Pedro Martínez |
Consulta:
SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
CROSS JOIN Customers;
Resultado:
OrderID | CustomerName | OrderDate |
---|---|---|
304101 | Servicios Melódicos | 10-05-2021 |
304101 | Astas y Pezuñas | 10-05-2021 |
304101 | Gestión Raíz | 10-05-2021 |
304102 | Servicios Melódicos | 20-06-2021 |
304102 | Astas y Pezuñas | 20-06-2021 |
304102 | Gestión Raíz | 20-06-2021 |
304103 | Servicios Melódicos | 25-07-2021 |
304103 | Astas y Pezuñas | 25-07-2021 |
304103 | Gestión Raíz | 25-07-2021 |
Unión propia (SELF JOIN)
Se utiliza cuando en una consulta es necesario conectar varias entradas de una misma tabla.
En SQL no hay un operador independiente para describir las SELF JOIN. Por lo tanto, para describir la conexión de datos de una misma tabla, utiliza los operadores JOIN o WHERE.
Ten en cuenta que en una sola consulta no puedes utilizar dos veces el nombre de una misma tabla: de lo contrario, la consulta devolverá un error. Por lo tanto, para realizar la conexión de una tabla SQL consigo misma, en la consulta se le asignan dos nombres temporales diferentes: alias.
Sintaxis de SELF JOIN al utilizar el operador JOIN:
SELECT column_name(s)
FROM table1 a1
JOIN table1 a2
ON a1.column_name = a2.column_name;
El operador JOIN puede ser cualquiera: utiliza LEFT JOIN, RIGHT JOIN. El resultado será el mismo que cuando se unían dos tablas diferentes.
Sintaxis de la unión propia al utilizar el operador WHERE:
SELECT column_name(s)
FROM table1 a1, table1 a2
WHERE a1.common_col_name = a2.common_col_name;
Ejemplo:
Tabla Students:
StudentID | Name | CourseID | Duration |
---|---|---|---|
1 | Antony | 1 | 3 |
2 | Paola | 2 | 4 |
1 | Antony | 2 | 4 |
3 | Boris | 3 | 2 |
2 | Irina | 3 | 5 |
Consulta con el operador WHERE:
SELECT s1.StudentID, s1.Name
FROM Students AS s1, Students s2
WHERE s1.StudentID = s2.StudentID
AND s1.CourseID <> s2.CourseID;
Resultado:
StudentID | Name |
---|---|
1 | Antony |
2 | Irina |
1 | Antony |
2 | Paola |
Consulta con el operador JOIN:
SELECT s1.StudentID, s1.Name
FROM Students s1
JOIN Students s2
ON s1.StudentID = s2.StudentID
AND s1.CourseID <> s2.CourseID
GROUP BY StudentID;
Resultado:
StudentID | Name |
---|---|
1 | Antony |
2 | Irina |
Lo más importante sobre JOIN en SQL
- En SQL, se utilizan los operadores de unión JOIN para combinar datos de varias tablas. Cuando el resultado debe contener solo los datos de dos tablas con una clave común, se utiliza
INNER JOIN
o simplementeJOIN
. - Si necesitas una lista completa de las entradas de una de las tablas, combinadas con los datos de otra, utiliza los operadores
LEFT
yRIGHT JOIN
. - Si el resultado debe contener la lista completa de las entradas de ambas tablas, donde algunas entradas están combinadas, utiliza el operador
FULL JOIN
. - Si necesitas el producto cartesiano de dos tablas, utiliza el operador
CROSS JOIN
. Si necesitas conectar datos de una misma tabla entre sí, necesitas unaSELF JOIN
.
Aprende a escribir consultas SQL en el curso «SQL». Aprende las funciones agregadas, las subconsultas y WITH, JOIN, las funciones de ventana y mucho más, y además, resuelve un problema empresarial con SQL.