Essenciais do SQL Server: Usando Junções SQL

Em bancos de dados relacionais como o SQL Server, a instrução SQL JOIN é usada para consultar, conectar e recuperar dados de várias tabelas com base nas relações de dados entre essas tabelas. Você pode usar a instrução SQL JOIN com duas ou mais tabelas, e essencialmente retorna registros que têm valores correspondentes nas diferentes tabelas. Neste tutorial, vou explicar como usar os tipos mais comuns de SQL JOIN, incluindo o SQL INNER JOIN, o SQL LEFT JOIN, o SQL RIGHT JOIN e o SQL OUTER JOIN.

Joins SQL são um recurso essencial para usar ao trabalhar com bancos de dados relacionais. Eles são principalmente executados usando a instrução SQL SELECT. Você pode aprender mais sobre como começar com a instrução T-SQL SELECT no meu artigo anterior sobre Servidores SQL: Usando SQL SELECT e as Cláusulas WHERE e HAVING para Recuperar Dados.

Publicidade

SQL INNER JOIN

A operação SQL INNER JOIN cria um conjunto de resultados combinando linhas que têm valores correspondentes em duas ou mais tabelas. Este é provavelmente o tipo de junção mais comumente usado em T-SQL. O SQL INNER JOIN apenas retorna linhas que têm valores correspondentes e é usado para recuperar dados que aparecem em todas as tabelas.

O diagrama seguinte ilustra como funciona uma operação SQL INNER JOIN com duas tabelas.

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

A sintaxe para um INNER JOIN é bastante simples. Como parte da sua instrução SELECT, você especifica as duas tabelas para unir e as colunas a serem usadas para combinar as linhas.

Vamos dar uma olhada mais de perto em duas tabelas do banco de dados de exemplo AdventureWorksLT2019. Se usarmos as tabelas SalesLT.Customer e SalesLT.SalesOrderHeader, podemos usar um SQL INNER JOIN para recuperar os pedidos dos clientes na tabela SalesLT.Customer unindo as duas tabelas na coluna CustomerID, que é uma coluna comum em ambas as tabelas.

Propaganda

Aqui está a consulta T-SQL que você pode usar para realizar isso:

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

Aqui está como a sintaxe para o SQL INNER JOIN funciona:

  • Aqui, você pode ver que estamos selecionando as colunas ‘CustomerID’, ‘FirstName’ e ‘LastName’ da tabela SalesLT.Customer, e as colunas ‘SalesOrderID’ e ‘OrderDate’ da tabela SalesLT.SalesOrderHeader.
  • Os ‘c’ e ‘soh’ são alias de tabela abreviados que eliminam a necessidade de sempre usar o nome completo da tabela ao se referir a colunas.
  • Estamos usando a palavra-chave INNER JOIN para unir as duas tabelas. A palavra-chave ON especifica a coluna a ser usada para a junção. Aqui é a coluna ‘CustomerID’.

Essa consulta retornará um conjunto de resultados que inclui as colunas ‘CustomerID’, ‘FirstName’, ‘LastName’, ‘SalesOrderID’ e ‘OrderDate’ para cada cliente que fez um pedido, como você pode ver na figura a seguir.

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

SQL LEFT JOIN

A operação SQL LEFT OUTER JOIN também criará um conjunto de resultados combinando linhas entre nossas duas tabelas anteriores. Com o SQL LEFT JOIN, no entanto, se nenhuma linha corresponder da tabela da esquerda, ele mostrará essas linhas com valores nulos.

Publicidade

Isso é útil quando você deseja incluir todas as linhas da primeira tabela e apenas as linhas correspondentes da segunda tabela, mesmo se não houver correspondência na tabela da direita. O SQL LEFT OUTER JOIN retornará valores nulos nas colunas da tabela da direita se não houver correspondência.

O diagrama a seguir ilustra como funciona uma operação SQL LEFT OUTER JOIN com duas tabelas.

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

A sintaxe para o LEFT JOIN também é bastante simples. Como parte da declaração SELECT, você especifica as duas tabelas para unir, as colunas a serem usadas para combinar linhas e a cláusula LEFT JOIN.

Vamos dar uma olhada mais de perto em duas tabelas do banco de dados AdventureWorksLT2019. Por exemplo, para recuperar todos os clientes e quaisquer pedidos que eles tenham, você pode usar as tabelas SalesLT.Customer e SalesLT.SalesOrderHeader e executar um LEFT JOIN, como mostrado na listagem a seguir:

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
  • Neste exemplo, estamos selecionando as colunas ‘CustomerID’, ‘FirstName’, ‘LastName’, ‘SalesOrderID’ e ‘OrderDate’ das tabelas SalesLT.Customer e SalesLT.SalesOrderHeader.
  • Estamos usando a palavra-chave LEFT JOIN para unir as duas tabelas e a palavra-chave ON que estaremos usando na coluna ‘CustomerID’ para unir as duas tabelas.

Você pode ver os resultados desta consulta SQL LEFT JOIN na figura abaixo.

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

Esta consulta retornará um conjunto de resultados que inclui todos os clientes na tabela SalesLT.Customer, juntamente com quaisquer informações de pedido correspondentes da tabela SalesLT.SalesOrderHeader. Se um cliente não tiver pedidos na tabela SalesLT.SalesOrderHeader, então as colunas dessa tabela serão nulas. Você pode ver vários valores nulos na figura anterior.

SQL RIGHT JOIN

Como você pode imaginar, a operação SQL RIGHT OUTER JOIN é essencialmente o oposto do LEFT OUTER JOIN. O RIGHT OUTER JOIN seleciona dados da tabela direita (Tabela 2) e relaciona esses dados com as linhas da tabela esquerda (Tabela 1).

O RIGHT JOIN retorna um conjunto de resultados que inclui todas as linhas na tabela direita, mesmo que elas não tenham linhas correspondentes da tabela esquerda. Se uma linha na tabela direita não tiver uma linha correspondente na tabela esquerda, então o conjunto de resultados para as colunas da tabela esquerda será nulo.

O diagrama a seguir ilustra como um JOIN direito funciona com duas tabelas:

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

Podemos mostrar isso com as tabelas SalesLT.Customer e SalesLT.SalesOrderHeader do banco de dados AdventuresLT2019. Para recuperar todos os pedidos e suas informações de cliente correspondentes, você pode usar uma consulta RIGHT JOIN como pode ver no exemplo a seguir:

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
  • Neste exemplo, estamos selecionando as colunas ‘CustomerID’, ‘FirstName’, ‘LastName’, ‘SalesOrderID’ e ‘OrderDate’ das tabelas SalesLT.Customer e SalesLT.SalesOrderHeader.
  • A palavra-chave RIGHT JOIN é usada para unir as duas tabelas, e a palavra-chave ON especifica que estamos unindo as duas tabelas na coluna ‘CustomerID’.

Esta consulta retornará um conjunto de resultados que inclui todos os pedidos na tabela SalesLT.SalesOrderHeader, juntamente com suas informações de cliente correspondentes da tabela SalesLT.Customer, se estiverem disponíveis. Se um pedido não tiver um cliente correspondente na tabela SalesLT.Customer, as colunas do cliente no conjunto de resultados serão nulas.

Você pode notar que esta consulta é muito semelhante à consulta anterior. No entanto, o LEFT JOIN resultou em muitas linhas da tabela SaleOrderHeader que tinham valores nulos. No entanto, nossa última consulta não tem valores nulos nas linhas da tabela SaleOrderHeader.

Os resultados de nossa operação de SQL RIGHT OUTER JOIN são mostrados na seguinte figura.

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

SQL OUTER JOIN

O SQL OUTER JOIN não é o tipo mais comum de operação de junção. Às vezes chamado de FULL JOIN, a consulta OUTER JOIN não apenas recuperará as linhas correspondentes, mas também as linhas não correspondentes. Em outras palavras, ele retorna dados da tabela unida quando há uma correspondência em ambas as tabelas à esquerda ou à direita.

Como você pode imaginar, isso tende a produzir conjuntos de resultados maiores do que os outros tipos de junção. O diagrama a seguir ilustra como um SQL OUTER JOIN funciona com duas tabelas.

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 fazer isso, podemos usar um FULL OUTER JOIN. Isso também retornará quaisquer linhas de SalesOrderDetail que não tenham uma linha correspondente em SalesOrderHeader. Na maioria dos casos normais, todas as linhas de SalesOrderDetails devem ter uma linha correspondente em SalesOrderHearder, mas isso pode não ser o caso se houver um erro de aplicativo ou sistema, o que isso pode ajudar a detectar.

Aqui está uma consulta T-SQL mostrando um exemplo de FULL OUTER JOIN:

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
  • Neste exemplo, estamos selecionando as colunas ‘SalesOrderID’, ‘OrderDate’, ‘ProductID’, ‘Quantity’ e ‘UnitPrice’ tanto das tabelas SalesLT.SalesOrderHeader quanto das tabelas SalesLT.SalesOrderDetail.
  • Estamos usando a palavra-chave FULL OUTER JOIN para juntar as duas tabelas, e a palavra-chave ON para especificar que a coluna SalesOrderID será usada para juntar as duas tabelas.
  • Esta consulta retornará um conjunto de resultados que inclui todos os pedidos de venda na tabela SalesLT.SalesOrderHeader, juntamente com suas informações detalhadas correspondentes da tabela SalesLT.SalesOrderDetail. Também incluirá todos os detalhes na tabela SalesLT.SalesOrderDetail, juntamente com suas informações de cabeçalho de pedido correspondentes, se estiverem disponíveis.
  • Se um pedido de venda não tiver detalhes na tabela SalesLT.SalesOrderDetail, as colunas serão NULL. Se um detalhe não tiver um pedido de venda correspondente na tabela SalesLT.SalesOrderHeader, então as colunas de pedido de venda serão NULL.

Os resultados desta operação FULL OUTER JOIN são mostrados na seguinte figura.

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

Aprendendo os fundamentos do SQL Join

Neste tutorial, eu abordei os tipos mais comuns de SQL JOINS. Eu mostrei como usar o INNER JOIN, o LEFT JOIN, o RIGHT JOIN e o OUTER JOIN, e também expliquei como eles são diferentes e onde podem ser usados. Em um próximo post, eu irei abordar alguns dos joins menos comuns, como o CROSS JOIN e o SELF JOIN, então fique ligado no Petri!

Artigo Relacionado:

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