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, explicarei como usar os tipos mais comuns de SQL JOIN, incluindo SQL INNER JOIN, SQL LEFT JOIN, SQL RIGHT JOIN e SQL OUTER JOIN.
Joins SQL são uma característica essencial a ser usada 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 em meu artigo anterior sobre SQL Servers: Usando SQL SELECT e as Cláusulas WHERE e HAVING para Recuperar Dados.
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. Esta é provavelmente a operação de junção mais comumente usada no T-SQL. SQL INNER JOIN apenas retorna linhas que têm valores correspondentes, e é usado para recuperar dados que aparecem em todas as tabelas.
O seguinte diagrama ilustra como uma operação INNER JOIN SQL funciona com duas tabelas.

A sintaxe para um INNER JOIN é bastante direta. Como parte da sua instrução SELECT, você especifica as duas tabelas para unir e as colunas a serem usadas para coincidir 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.
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 apelidos 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’.
Esta 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.

SQL LEFT JOIN
A operação SQL LEFT OUTER JOIN também criará um conjunto de resultados combinando linhas entre nossas duas tabelas anteriores. No entanto, com o SQL LEFT JOIN, se não houver registros correspondentes na tabela esquerda, ele mostrará esses registros com valores nulos.
Isso é útil quando você deseja incluir todas as linhas da primeira tabela e apenas as linhas correspondentes da segunda tabela, mesmo que não haja correspondência na tabela direita. O SQL LEFT OUTER JOIN retornará valores nulos nas colunas da tabela direita se não houver correspondência.
O seguinte diagrama ilustra como uma operação SQL LEFT OUTER JOIN funciona com duas tabelas.

A sintaxe para o LEFT JOIN também é bastante simples. Como parte da SELECT declaração, você especifica as duas tabelas para se juntar, as colunas para usar para combinar linhas e a LEFT JOIN cláusula.
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 realizar um LEFT JOIN como você pode ver na seguinte listagem:
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 iremos usar na coluna ‘CustomerID’ para unir as duas tabelas.
Você pode ver os resultados desta consulta SQL LEFT JOIN na figura abaixo.

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 nenhum pedido 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 da direita (Tabela 2) e combina esses dados com as linhas da tabela da esquerda (Tabela 1).
O RIGHT JOIN retorna um conjunto de resultados que inclui todas as linhas na tabela da direita, mesmo se elas não tiverem linhas correspondentes na tabela da esquerda. Se uma linha na tabela da direita não tiver uma linha correspondente na tabela da esquerda, então o conjunto de resultados para as colunas da tabela da esquerda será nulo.
O diagrama a seguir ilustra como um RIGHT JOIN funciona com duas tabelas:

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 da nossa operação SQL RIGHT OUTER JOIN são mostrados na figura a seguir.

SQL OUTER JOIN
O SQL OUTER JOIN não é o tipo mais comum de operação de junção. Às vezes chamada de FULL JOIN, a consulta OUTER JOIN não só 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 qualquer uma das 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.

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 tinham uma linha correspondente de SalesOrderHeader. Na maioria dos casos normais, todas as linhas de SalesOrderDetails devem ter uma linha correspondente de SalesOrderHeader, mas isso pode não ser o caso se houve um erro de aplicativo ou sistema 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 SalesLT.SalesOrderDetail.
- Estamos usando a palavra-chave FULL OUTER JOIN para unir as duas tabelas, e a palavra-chave ON para especificar que a coluna SalesOrderID será usada para unir 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, então 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 figura a seguir.

Aprendendo os fundamentos de junção SQL
Neste tutorial, cobri os tipos mais comuns de SQL JOINS. 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, estarei abordando 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/