Conceptos básicos de SQL Server: Uso de SQL Joins

En bases de datos relacionales como SQL Server, la instrucción SQL JOIN se utiliza para consultar, conectar y recuperar datos de múltiples tablas en función de las relaciones de datos entre esas tablas. Puedes utilizar la instrucción SQL JOIN con dos o más tablas, y esencialmente devuelve registros que tienen valores coincidentes en las diferentes tablas. En este tutorial, explicaré cómo utilizar los tipos de SQL JOIN más comunes, incluyendo el SQL INNER JOIN, el SQL LEFT JOIN, el SQL RIGHT JOIN y el SQL OUTER JOIN.

SQL Joins son una característica esencial para usar al trabajar con bases de datos relacionales. Se ejecutan principalmente utilizando la instrucción SQL SELECT. Puedes aprender más sobre cómo empezar con la instrucción T-SQL SELECT en mi artículo anterior sobre SQL Servers: Usando SQL SELECT y las cláusulas WHERE y HAVING para recuperar datos.

Anuncio

SQL INNER JOIN

La operación SQL INNER JOIN crea un conjunto de resultados combinando filas que tienen valores coincidentes en dos o más tablas. Probablemente sea la operación de unión más comúnmente utilizada en T-SQL. SQL INNER JOIN solo devuelve filas que tienen valores coincidentes, y se utiliza para recuperar datos que aparecen en todas las tablas.

El siguiente diagrama ilustra cómo funciona una operación SQL INNER JOIN con dos tablas.

How an SQL INNER JOIN operation works with two tables (Image credit: Petri/Michael Otey)

La sintaxis para un INNER JOIN es bastante sencilla. Como parte de tu instrucción SELECT, especificas las dos tablas a unir y las columnas a utilizar para emparejar filas.

Vamos a echar un vistazo más de cerca a dos tablas de la base de datos de ejemplo AdventureWorksLT2019. Si utilizamos las tablas SalesLT.Customer y SalesLT.SalesOrderHeader, podemos usar un SQL INNER JOIN para recuperar los pedidos de los clientes en la tabla SalesLT.Customer uniéndolas en la columna CustomerID, que es una columna común en ambas tablas.

Publicidad

Aquí tienes la consulta T-SQL que puedes utilizar para lograr eso:

USE AdventureWorksLT2019

SELECT c.CustomerID, c.FirstName, c.LastName, soh.SalesOrderID, soh.OrderDate 
FROM SalesLT.Customer c
INNER JOIN SalesLT.SalesOrderHeader soh ON c.CustomerID = soh.CustomerID

Así es como funciona la sintaxis para el SQL INNER JOIN:

  • Aquí, puedes ver que estamos seleccionando las columnas ‘CustomerID’, ‘FirstName’ y ‘LastName’ de la tabla SalesLT.Customer, y las columnas ‘SalesOrderID’ y ‘OrderDate’ de la tabla SalesLT.SalesOrderHeader.
  • Las ‘c’ y ‘soh’ son alias de tabla abreviados que eliminan la necesidad de usar siempre el nombre completo de la tabla al referirse a columnas.
  • Estamos utilizando la palabra clave INNER JOIN para unir las dos tablas. La palabra clave ON especifica la columna a utilizar para la unión. Aquí es la columna ‘CustomerID’.

Esta consulta devolverá un conjunto de resultados que incluye las columnas ‘CustomerID’, ‘FirstName’, ‘LastName’, ‘SalesOrderID’ y ‘OrderDate’ para cada cliente que haya realizado un pedido, como se puede ver en la siguiente figura.

The result of our SQL INNER JOIN query (Image credit: Petri/Michael Otey)

SQL LEFT JOIN

La operación SQL LEFT OUTER JOIN también creará un conjunto de resultados al emparejar filas entre nuestras dos tablas anteriores. Sin embargo, con el SQL LEFT JOIN, si no hay registros coincidentes de la tabla izquierda, mostrará esos registros con valores nulos.

Anuncio

Esto es útil cuando desea incluir todas las filas de la primera tabla y solo las filas coincidentes de la segunda tabla, incluso si no hay coincidencia en la tabla derecha. El SQL LEFT OUTER JOIN devolverá valores nulos en las columnas de la tabla derecha si no hay coincidencia.

El siguiente diagrama ilustra cómo funciona una operación SQL LEFT OUTER JOIN con dos tablas.

How an SQL LEFT OUTER JOIN works with two tables (Image credit: Petri/Michael Otey)

La sintaxis para el LEFT JOIN también es bastante simple. Como parte de la SELECT declaración, especifica las dos tablas para unir, las columnas para usar para emparejar filas y la LEFT JOIN cláusula.

Echemos un vistazo más de cerca a dos tablas de la base de datos AdventureWorksLT2019. Por ejemplo, para recuperar todos los clientes y cualquier pedido que tengan, puede usar las tablas SalesLT.Customer y SalesLT.SalesOrderHeader y realizar un LEFT JOIN como se puede ver en la siguiente lista:

USE AdventureWorksLT2019

SELECT c.CustomerID, c.FirstName, c.LastName, soh.SalesOrderID, soh.OrderDate
FROM SalesLT.Customer c 
LEFT JOIN SalesLT.SalesOrderHeader soh ON c.CustomerID = soh.CustomerID
  • En este ejemplo, estamos seleccionando las columnas ‘CustomerID’, ‘FirstName’, ‘LastName’, ‘SalesOrderID’ y ‘OrderDate’ de las tablas SalesLT.Customer y SalesLT.SalesOrderHeader.
  • Estamos utilizando la palabra clave LEFT JOIN para unir las dos tablas y la palabra clave ON que estaremos utilizando en la columna ‘CustomerID’ para unir las dos tablas.

Puedes ver los resultados de esta consulta SQL LEFT JOIN en la figura a continuación.

The results of our SQL LEFT JOIN query (Image credit: Petri/Michael Otey)

Esta consulta devolverá un conjunto de resultados que incluye a todos los clientes en la tabla SalesLT.Customer, junto con cualquier información de pedido correspondiente de la tabla SalesLT.SalesOrderHeader. Si un cliente no tiene ningún pedido en la tabla SalesLT.SalesOrderHeader, entonces las columnas de esa tabla serán nulas. Puedes ver varios valores nulos en la figura anterior.

SQL RIGHT JOIN

Como podrías imaginar, la operación SQL RIGHT OUTER JOIN es esencialmente lo opuesto al LEFT OUTER JOIN. El RIGHT OUTER JOIN selecciona datos de la tabla derecha (Tabla 2) y empareja estos datos con las filas de la tabla izquierda (Tabla 1).

El RIGHT JOIN devuelve un conjunto de resultados que incluye todas las filas en la tabla derecha, incluso si no tienen filas coincidentes de la tabla izquierda. Si una fila en la tabla derecha no tiene una fila coincidente en la tabla izquierda, entonces el conjunto de resultados para las columnas de la tabla izquierda será nulo.

El siguiente diagrama ilustra cómo funciona un JOIN derecho con dos tablas:

How a right JOIN works with two tables (Image credit: Petri/Michael Otey)

Podemos mostrar esto con las tablas SalesLT.Customer y SalesLT.SalesOrderHeader de la base de datos AdventuresLT2019. Para recuperar todos los pedidos y su información de cliente correspondiente, puedes usar una consulta RIGHT JOIN como puedes ver en el siguiente ejemplo:

USE AdventureWorksLT2019

SELECT c.CustomerID, c.FirstName, c.LastName, soh.SalesOrderID, soh.OrderDate
FROM SalesLT.Customer c 
RIGHT JOIN SalesLT.SalesOrderHeader soh ON c.CustomerID = soh.CustomerID
  • En este ejemplo, estamos seleccionando las columnas ‘CustomerID’, ‘FirstName’, ‘LastName’, ‘SalesOrderID’ y ‘OrderDate’ de las tablas SalesLT.Customer y SalesLT.SalesOrderHeader.
  • El RIGHT JOIN se utiliza para unir las dos tablas, y el ON especifica que estamos uniendo las dos tablas en la columna ‘CustomerID’.

Esta consulta devolverá un conjunto de resultados que incluye todas las órdenes en la tabla SalesLT.SalesOrderHeader, junto con la información de su cliente correspondiente de la tabla SalesLT.Customer si está disponible. Si una orden no tiene un cliente correspondiente en la tabla SalesLT.Customer, las columnas de cliente en el conjunto de resultados serán nulas.

Puede notar que esta consulta es muy similar a la consulta anterior. Sin embargo, el LEFT JOIN resultó en muchas filas de la tabla SaleOrderHeader que tenían valores nulos. Sin embargo, nuestra última consulta no tiene valores nulos en las filas de la tabla SaleOrderHeader.

Los resultados de nuestra operación SQL RIGHT OUTER JOIN se muestran en la siguiente figura.

The results of our SQL RIGHT OUTER JOIN operation (Image credit: Petri/Michael Otey)

SQL OUTER JOIN

SQL OUTER JOIN no es el tipo de operación de unión más común. A veces llamado FULL JOIN, la consulta OUTER JOIN no solo recuperará las filas coincidentes sino también las filas no coincidentes. En otras palabras, devuelve datos de la tabla unida cuando hay una coincidencia en cualquiera de las tablas izquierda o derecha.

Como podría suponer, esto tiende a producir conjuntos de resultados más grandes que los otros tipos de unión. El siguiente diagrama ilustra cómo funciona una SQL OUTER JOIN con dos tablas.

How an SQL OUTER JOIN works with two tables (Image credit: Petri/Michael Otey)

I’ll give you an example of an SQL OUTER JOIN operation using the SalesLT.SalesOrderHeader and SalesLT.SalesOrderDetail tables. Here, we want to retrieve all sales orders and their associated details, including orders that don’t have any details records.

Para hacer esto, podemos usar un JOIN EXTERNO COMPLETO. Esto también devolverá cualquier fila de SalesOrderDetail que no tenga una fila correspondiente de SalesOrderHeader. En la mayoría de los casos normales, todas las filas de SalesOrderDetails deberían tener una fila correspondiente de SalesOrderHeader, pero esto podría no ser así si ha habido un error de aplicación o del sistema que esto puede ayudar a detectar.

Aquí hay una consulta T-SQL que muestra un ejemplo de JOIN EXTERNO COMPLETO:

USE AdventureWorksLT2019

SELECT soh.SalesOrderID, soh.OrderDate, sod.ProductID, sod.OrderQty, sod.UnitPrice
FROM SalesLT.SalesOrderHeader soh
FULL OUTER JOIN SalesLT.SalesOrderDetail sod
ON soh.SalesOrderID = sod.SalesOrderID
  • En este ejemplo, estamos seleccionando las columnas ‘SalesOrderID’, ‘OrderDate’, ‘ProductID’, ‘Quantity’ y ‘UnitPrice’ tanto de las tablas SalesLT.SalesOrderHeader como de SalesLT.SalesOrderDetail.
  • Estamos usando la palabra clave FULL OUTER JOIN para unir las dos tablas, y la palabra clave ON para especificar que la columna SalesOrderID se usará para unir las dos tablas.
  • Esta consulta devolverá un conjunto de resultados que incluye todas las órdenes de venta en la tabla SalesLT.SalesOrderHeader, junto con su información de detalle correspondiente de la tabla SalesLT.SalesOrderDetail. También incluirá todos los detalles en la tabla SalesLT.SalesOrderDetail, junto con su información de encabezado de pedido correspondiente si está disponible.
  • Si una orden de venta no tiene ningún detalle en la tabla SalesLT.SalesOrderDetail, entonces las columnas serán NULL. Si un detalle no tiene una orden de venta correspondiente en la tabla SalesLT.SalesOrderHeader, entonces las columnas de la orden de venta serán NULL.

Los resultados de esta operación FULL OUTER JOIN se muestran en la siguiente figura.

The results of our FULL OUTER JOIN operation (Image credit: Petri/Michael Otey)

Aprendiendo los fundamentos de los JOIN en SQL

En este tutorial, cubrí los tipos más comunes de SQL JOINS. Mostré cómo usar el INNER JOIN, el LEFT JOIN, el RIGHT JOIN y el OUTER JOIN, y también expliqué cómo son diferentes y dónde se pueden usar. En una próxima publicación, estaré cubriendo algunos de los joins menos comunes como el CROSS JOIN y el SELF JOIN, ¡así que mantente atento a Petri!

Artículo relacionado:

Source:
https://petri.com/sql-join/