Voltar para a lista de artigos Artigos
8 minutos de leitura

O que é o OUTER JOIN em SQL?

Mesmo que você seja novo em SQL, você deve ter se deparado com o termo OUTER JOIN. Neste artigo, vou explicar o que OUTER JOIN in SQL faz. Vou usar alguns exemplos práticos para demonstrar como ele é usado nas aplicações SQL do dia-a-dia.

Se você quiser usar SQL para fins práticos, aprender os diferentes JOINs é extremamente importante. Na verdade, você estará usando um JOIN em quase todos os segundos em que escrever. Portanto, é imperativo que você gaste algum esforço para se sentir confortável com elas.

Embora este artigo inclua algumas informações básicas sobre JOIN em geral e OUTER JOIN em particular, eu recomendo aos alunos sérios que aceitem o Cláusulas JOIN em SQL curso por LearnSQL.com.br. É um grupo interativo de 93 exercícios práticos divididos em 5 seções, e lhe dará uma compreensão profunda de SQL JOINs.

Dito isto, vamos mergulhar diretamente no tema, começando com o que um SQL JOIN faz.

O que é um JOIN?

Um SQL JOIN é usado para combinar dados de duas ou mais tabelas e depois gerar uma única tabela de saída que contém colunas selecionadas de ambas as tabelas. Você normalmente usará um ou mais valores comuns nas tabelas para ligá-las. Você especifica como combinar linhas de duas tabelas na condição JOIN: as linhas de ambas as tabelas que satisfazem a condição são combinadas e adicionadas à tabela de resultados.

Por exemplo, digamos que você tenha um banco de dados de informações de clientes. Quando um cliente se registra com sua empresa. você salva seus dados (Customer_Number, Customer_Name, Age, Postal_Code, e Address) em uma tabela chamada customers. Os detalhes dos pedidos que o cliente faz são armazenados em outra tabela chamada orders, que contém o Order_Number, Order_Date, Expected_Shipping_Date, e Customer_Number.

Imagine que um cliente faz um pedido e você precisa saber seu endereço de entrega. No entanto, a tabela orders só tem o Customer_Number. Para recuperar o endereço do cliente, você precisará JOIN as tabelas customers e orders com base no Customer_Number.

Neste caso, Customer_Number serve como os valores da coluna que você compara.

customers:

Customer_NumberCustomer_NameAgePostal_CodeAddress
103Atelier274400054, RueRoyal
112Signal32830308489 Strong
114Collector273004636 Kilda
119La Roche274400067, rue chimay
121Baane mini324110Ering Shakkes

orders:

Order_NumberOrder_DateExpected_Shipping_DateCustomer_Number
1034531-01-202210-02-2022103
1034630-01-202215-02-2022112
1012005-02-202216-02-2022114
1032506-02-202210-02-2022121
1121108-02-202221-02-20224110

Aqui está a consulta que você usaria para vincular todos os números de pedidos com nomes e endereços de clientes:

SELECT 
  a.Order_Number, 
  b.Customer_Name, 
  b.Postal_Code, 
  b.Address 
FROM orders a 
JOIN customers b  
ON a.Customer_Number = b.Customer_Number;

E aqui está o resultado:

Order_NumberCustomer_NamePostal_CodeAddress
10345Atelier4400054, RueRoyal
10346Signal830308489 Strong
10120Collectors3004636 Kilda
10325Baane Mini4110Ering Shakkes

Nesta consulta, SQL seleciona as colunas Order_Number a partir da tabela orders e Customer_Name, Postal_Code, e Address da tabela customers. Customer_Number é a coluna utilizada na condição JOIN. Para cada pedido, o número do cliente correspondente de orders é comparado com o número do cliente no customers mesa. O nome do cliente, o código postal e o endereço são recuperados para esse pedido.

Este é um exemplo clássico de um INNER JOIN (também conhecido como um simples ou regular JOIN; a palavra-chave INNER é opcional). É uma das mais utilizadas JOINs em SQL. INNER JOIN basicamente significa que apenas aquelas linhas onde os valores são comuns entre as duas tabelas serão recuperados. Observe que as linhas com o número de cliente 119 (que não tinha pedidos correspondentes) e o número de pedido 11211 (que não tinha número de cliente correspondente) não foram incluídos no resultado.

Entretanto, INNER JOIN não é o único JOIN que a SQL oferece. Existem vários tipos de OUTER JOIN que você deve conhecer.

JOINS EXPLICADOS

Em SQL, JOINs são categorizados como:

  1. INNER JOIN - Retorna apenas linhas onde os valores correspondem à condição JOIN em ambas as tabelas. Linhas em qualquer uma das tabelas que não correspondam a esta condição são ignoradas.
  2. OUTER JOIN
    1. LEFT JOIN - Retorna todas as linhas da tabela da esquerda (a tabela antes da palavra-chave JOIN ). Para linhas que têm uma correspondência na tabela da direita, retorna os valores da tabela da direita; para linhas sem uma correspondência na tabela da direita, preenche os valores que faltam com NULLs.
    2. RIGHT JOIN - Retorna todas as linhas da tabela certa (a tabela após a palavra-chave JOIN ). Para linhas que têm uma correspondência na tabela da esquerda, ele retorna os valores da tabela da esquerda; para linhas sem uma correspondência na tabela da esquerda, ele preenche os valores ausentes com NULLs.
    3. FULL JOIN - Retorna todas as linhas em ambas as tabelas, usando NULLs para valores sem correspondência.

Para qualquer JOIN, a estrutura básica de consulta SQL é:

<SELECT <list of columns>
FROM <table 1> 
LEFT/RIGHT/FULL/INNER JOIN <table 2> 
ON <join condition>
WHERE <other conditions>;

Nota: Ao invés da palavra-chave LEFT JOIN você pode alternativamente usar LEFT OUTER JOIN. A palavra-chave OUTER é opcional. Da mesma forma, você pode usar RIGHT OUTER JOIN em vez de RIGHT JOIN, bem como FULL OUTER JOIN em vez de FULL JOIN sem qualquer alteração nos resultados da consulta.

OUTER JOIN é usado para recuperar todos os registros das tabelas, mesmo para aqueles registros sem valor correspondente na outra tabela, com base na condição JOIN. Nesses casos, retorna NULL como o valor para as colunas em falta.

OUTER JOIN é usado para recuperar todos os registros das tabelas, mesmo para aqueles registros sem valor correspondente na outra tabela com base na condição de JOIN. Nesses casos, ele retorna NULL como o valor para as colunas ausentes.

Como mencionado anteriormente, existem três tipos de OUTER JOIN: LEFT OUTER JOIN, RIGHT OUTER JOIN e FULL OUTER JOIN. Deixe-me levá-los através de alguns exemplos para demonstrar como eles funcionam.

JUNÇÃO EXTERNA ESQUERDA

Imagine que você precisa recuperar todos os pedidos junto com as informações do cliente. Mas você também precisa incluir os pedidos que não têm informações do cliente. Neste caso, você pode usar um LEFT OUTER JOIN.

Consulta:


SELECT 
  a.Order_Number, 
  b.Customer_Name, 
  b.Postal_Code 
FROM orders a 
LEFT JOIN customers b -- alternatively use LEFT OUTER JOIN instead of LEFT JOIN
ON a.Customer_Number = b.Customer_Number;

Saída:

Order_NumberCustomer_NamePostal_CodeAddress
10345Atelier4400054, RueRoyal
10346Signal830308489 Strong
10120Collectors3004636 Kilda
10325Baane Mini4110Ering Shakkes

Observe que, como você especificou 'LEFT JOIN' na consulta, esta consulta funciona primeiro recuperando todas as linhas na tabela da esquerda e depois recuperando o valor correspondente na tabela da direita. A tabela da esquerda é a tabela dada antes da palavra-chave JOIN (aqui, a orders tabela). A consulta retorna NULL nas colunas da tabela da direita (Customer_Name, Postal_Code) para todas aquelas linhas para as quais não há valor correspondente de cliente_número na tabela de clientes. Observe que o número do pedido 11211 (o pedido sem um cliente atribuído) foi incluído nos resultados, com valores NULL nas colunas Nome_do_cliente e Código_Código_Correio_Correio_do_cliente.

UNIÃO EXTERNA DIREITA

Um RIGHT OUTER JOIN funciona exatamente ao contrário de um LEFT OUTER JOIN. Ele recupera todas as linhas da tabela da direita (a tabela dada após a palavra-chave JOIN ) e os valores correspondentes da tabela da esquerda. Há NULLs para todas as linhas para as quais a tabela da esquerda não tem uma correspondência. Vamos ver um exemplo.

Consulta:

SELECT 
  a.Order_Number, 
  b.Customer_Name, 
  b.Postal_Code 
FROM orders a 
RIGHT JOIN customers b -- alternatively use RIGHT OUTER JOIN instead of RIGHT JOIN
ON a.Customer_Number = b.Customer_Number;

Saída:

Order_NumberCustomer_NamePostal_Code
10345Atelier44000
10346Signal83030
10120Collectors3004
10325Baane Mini4110
NULLLa Roche44000

Aqui, o cliente (La Roche) que não fez nenhum pedido está no resultado da consulta; o pedido sem um cliente foi omitido. Isto porque utilizamos um RIGHT OUTER JOIN; todos os registros da direita (customers) tabela foram incluídas.

UNIÃO EXTERNA COMPLETA

Mas e se você quiser todas as fileiras de ambas as mesas? Use o FULL OUTER JOIN. Este JOIN retorna todas as linhas de ambas as tabelas, substituindo NULL por qualquer valor de linha que não esteja presente na outra tabela.

Consulta:

SELECT 
  a.Order_Number, 
  b.Customer_Name, 
  b.Postal_Code 
FROM orders a 
FULL JOIN customers b --alternatively use ‘FULL OUTER JOIN’ instead of ‘FULL JOIN’
ON a.Customer_Number = b.Customer_Number;

Saída:

Os resultados incluem tanto o cliente La Roche (que não tem pedidos) quanto o 11211 (que não tem informações do cliente).

Diferença entre INNER e OUTER JOIN

Como você já deve ter percebido, a principal diferença entre INNER JOIN e OUTER JOIN é se devemos incluir as linhas para as quais não temos uma correspondência na outra tabela. Enquanto um INNER JOIN só retorna linhas onde há uma correspondência entre as duas tabelas, um OUTER JOIN (dependendo do tipo) também retorna aquelas linhas para as quais não há uma linha correspondente na outra tabela.

Pronto para usar o OUTER JOIN em suas consultas?

Espero que este artigo tenha lhe dado uma boa idéia de como usar OUTER JOIN. Se você quiser mergulhar mais no uso do SQL JOINs, confira a tabela Cláusulas JOIN em SQL curso que mencionei anteriormente. Se você está apenas começando sua jornada de aprendizagem SQL, eu recomendaria o SQL de A a Z pista. Ele contém 7 cursos SQL que o levam do básico ao avançado SQL. É ótimo para desenvolver uma base forte nesta linguagem.

De qualquer forma, como em qualquer outro campo, o aprendizado contínuo é a chave para o sucesso. Portanto, todo o melhor e feliz aprendizado!