Voltar para a lista de artigos Artigos
7 minutos de leitura

O que é o FULL JOIN e quando utilizá-lo

Saiba o que é um FULL JOIN, como implementá-lo, como ele se compara com outros tipos de Cláusulas JOIN em SQL, e alguns de seus casos de uso único.

Antes de saltarmos para FULL JOINs, vamos rapidamente recapitular o que é um FULL JOIN SQL JOIN. Em sua essência, um JOIN combina dados de duas ou mais tabelas dentro de um banco de dados. As tabelas são normalmente ligadas entre si usando identificadores únicos em cada tabela, ou seja, chaves primárias e estrangeiras.

Para demonstrar um simples SQL JOIN - também conhecido como um INNER JOIN - em ação, vamos considerar o Products e OrderDetails tabelas do conhecido banco de dados de amostras Northwind. O Products tabela contém uma lista de todos os produtos e o OrderDetails A tabela contém uma lista de todos os pedidos recentes.

PRODUCTS
ProductIDProductNameSupplierIDCategoryIDUnitPrice
1Chais1110 boxes x 20 bags18
2Chang1124 - 12 oz bottles19
3Aniseed Syrup1212 - 550 ml bottles10
..................

ORDERDETAILS
OrderDetaiIDOrderIDProductIDQuantity
1102481112
2102484210
310248725
............

Aqui está a consulta:

SELECT 
Products.ProductName, OrderDetails.OrderID, OrderDetails.Quantity
FROM Products
JOIN OrderDetails 
ON Products.ProductID=OrderDetails.ProductID
ORDER BY Quantity Desc;

E o resultado:

ProductNameOrderIDQuantity
Pâté chinois10398120
Steeleye Stout10286100
Sirop d'érable1044090

O exemplo acima usa ProductID (que está disponível em ambas as tabelas) como a chave para unir as duas tabelas e exibir cada ordem ordenada em ordem decrescente por Quantity. Note que um simples JOIN como o acima só retorna as linhas correspondentes das duas tabelas. Neste caso, os resultados só incluiriam produtos e pedidos recentemente encomendados que estão vinculados a um ProductID válido.

JUNÇÃO COMPLETA

COMPLETO: Uma Introdução

Ao contrário de INNER JOIN, um FULL JOIN retorna todas as linhas de ambas as tabelas unidas, quer tenham ou não uma linha correspondente. Portanto, um FULL JOIN também é referido como FULL OUTER JOIN. Um FULL JOIN retorna linhas inigualáveis de ambas as tabelas, assim como a sobreposição entre elas. Quando não houver linhas correspondentes para uma linha na tabela da esquerda, as colunas da tabela da direita terão NULLs para esses registros. Da mesma forma, quando não houver linhas correspondentes para uma linha na tabela da direita, as colunas da tabela da esquerda terão NULLs.

Para demonstrar a diferença entre um simples SQL JOIN e um FULL OUTER JOIN, vamos considerar o Projects e Employees tabelas como mostrado abaixo. O Projects tabela contém uma lista de todos os projetos empreendidos pela empresa (projetos internos e terceirizados), enquanto a Employees tabela contém uma lista de todos os funcionários atuais e especifica se eles estão envolvidos em algum projeto da empresa.

PROJECTS
ProjectIDProjectNameCostYTDBusinessUnit
1CRM Upgrade45640Customer Relations
2Cybersecurity Protocol Implementation80200Cybersecurity
3HQ Office Renovations145000Facilities
4ERP Integration110000Corporate
5Database Stack Upgrade25000Engineering
............
15Automated QA10000Engineering

EMPLOYEES
EmployeeIDEmployeeNameProjectIDStartDateBusinessUnit
001Albert Ross32012-02-11Facilities
002Hummer BairdNULL2012-02-11Corporate
003Matthias Dias152012-07-15Engineering
004Al Cooper12014-04-15Customer Relations
005Macron RalfNULL2014-04-15Legal
...............
025Hamza ImranNULL2020-07-11Engineering

Se fizéssemos JOINs entre estas duas tabelas fazendo corresponder as tabelas através de ProjectID como a chave primária, os resultados de um simples INNER JOIN e um FULL OUTER JOIN seriam bem diferentes. Um INNER JOIN produziria uma tabela contendo apenas os resultados onde há uma correspondência entre as duas entradas correspondentes em ambas as tabelas. O resultado de INNER JOIN contém os nomes dos funcionários e os nomes dos projetos correspondentes:

EmployeeNameProjectName
Albert RossHQ Office Renovations
Matthias DiasAutomated QA
Al CooperCRM Upgrade

Por outro lado, um FULL OUTER JOIN produzirá os dados de ambas as tabelas, independentemente de ter uma correspondência na outra tabela:

EmployeeNameProjectName
Albert RossHQ Office Renovations
Hummer BairdNULL
Matthias DiasAutomated QA
Al CooperCRM Upgrade
.......
Hamza ImranNULL
NULLERP Integration

O resultado do FULL JOIN contém todos os nomes dos funcionários, independentemente de estarem atribuídos a um projeto, e todos os nomes de projetos, mesmo que não haja funcionários atribuídos a esse projeto.

Sintaxe FULL JOIN

A sintaxe básica de um FULL JOIN é semelhante a outros tipos de JOINs:

SELECT 
	left_table.column1, right_table.column2,...
FROM left_table
FULL OUTER JOIN right_table 
ON left_table.key = right_table.key;

A palavra-chave OUTER é opcional e pode ser omitida.

Exemplo

Agora, vamos analisar o exemplo de um FULL OUTER JOIN que mostra tanto o EmployeeName como o ProjectName novamente. Aqui está a pergunta:

SELECT 
Employees.EmployeeName, Projects.ProjectName
FROM Employees
FULL OUTER JOIN Projects 
ON Employees.ProjectID=Projects.ProjectID
ORDER BY EmployeeID;

E o resultado:

EmployeeNameProjectName
Albert RossHQ Office Renovations
Hummer BairdNULL
Matthias DiasAutomated QA
Al CooperCRM Upgrade
.......
Hamza ImranNULL
NULLERP Integration

A partir da tabela de resultados, vemos que um FULL JOIN também produz resultados NULL de ambos os Projects e Employees mesas - embora não houvesse fósforos na outra mesa. As NULLs na coluna ProjectName indicam que o funcionário não está especificamente designado a nenhum projeto e provavelmente serve a outras funções na empresa. Por outro lado, um NULL na coluna EmployeeName sugere que o projeto específico provavelmente é terceirizado e não é gerenciado diretamente por qualquer funcionário da empresa. Alternativamente, um valor NULL também poderia apontar para um erro potencial ou eliminação inadvertida de dados no banco de dados ou no sistema. (Discutiremos isto mais adiante).

É bom notar que alguns bancos de dados, como o MySQL, não suportam integrações completas. Nesse caso, você pode usar o operador UNION ALL para combinar os bancos de dados LEFT JOIN e RIGHT JOIN.

Nosso artigo anterior sobre Cláusulas JOIN em SQL tem mais alguns exemplos que você pode examinar. Nosso Cláusulas JOIN em SQL O curso também fornece exemplos abrangentes de FULL JOINs e inclui exercícios práticos para aperfeiçoar seus conhecimentos.

Casos de uso de adesão completa

Em comparação com os outros tipos de Cláusulas JOIN em SQL, você provavelmente usará FULL JOIN com menos freqüência. Dito isto, é uma ferramenta muito útil para algumas situações únicas. Alguns de seus casos de uso são:

  • Recuperar todos os registros de ambas as tabelas, quer haja ou não uma correspondência. Este é o exemplo que vimos acima.
  • Para encontrar dados não coincidentes ou órfãos de ambas as tabelas. Um registro órfão é um registro cujo valor chave estrangeiro faz referência a um valor chave primário inexistente; isto geralmente acontece em sistemas de escala rápida ou muito antigos.
  • Para executar relatórios de exceção. Esta é uma forma de análise de dados comparando um conjunto de dados com um conjunto de dados de base desejado/esperado e destacando itens que não correspondem.

Embora a aplicação de FULL JOINs seja bastante única, eles são uma ótima maneira de encontrar e diagnosticar possíveis problemas de integridade de dados.

Tipos de JOINs: Recapitulação

Como mencionamos acima, existem mais alguns tipos de JOINs.

Um INNER JOIN retorna filas quando a condição JOIN é satisfeita tanto na tabela da esquerda como na da direita. Em outras palavras, ela retorna apenas os registros correspondentes das tabelas. Este é o tipo mais comum de SQL JOIN e é o padrão quando não se especificou o tipo de JOIN.

Um OUTER JOIN retorna todas as linhas de uma tabela e algumas ou todas as linhas de outra tabela (dependendo do tipo de OUTER JOIN). Além do FULL OUTER JOIN, há dois outros tipos:

  • A LEFT OUTER JOIN retorna todas as linhas da tabela da esquerda, mesmo que não tenham sido encontradas linhas correspondentes na tabela da direita. Se não forem encontrados registros correspondentes na tabela da direita, a consulta retornará valores NULL para aquelas colunas.
  • Um RIGHT OUTER JOIN retorna todas as linhas de uma tabela correta. Se não houver registros correspondentes na tabela da esquerda, os valores NULL são retornados para essas colunas - o inverso de um LEFT JOIN.

Um CROSS JOIN (também chamado de cartesiano JOIN) retorna todas as combinações possíveis de linhas das tabelas que foram unidas. Como ele retorna todas as combinações possíveis, este é o único tipo JOIN que não precisa de uma condição JOIN e, portanto, não requer uma cláusula ON.

Para uma análise mais detalhada de cada um dos tipos JOIN, confira o artigo SQL JOIN Types Explained. Além disso, nosso Cláusulas JOIN em SQL curso abrange todos os diferentes tipos e casos de uso de JOINs em grande detalhe. Também aborda tópicos mais avançados, tais como os JOINs não-equi e os JOINs múltiplos.

Os JOINs são uma das características mais fundamentais e comumente utilizadas de SQL e uma parte essencial de qualquer conjunto de ferramentas do usuário SQL. Eles também são apresentados em perguntas comuns em entrevistas; veja nosso artigo As 10 perguntas mais frequentes sobre SQL JOIN Interview Questions e How to Answer Them para dicas úteis.

Aumente seu conhecimento sobre SQL FULL JOINs

Neste tutorial, você aprendeu as especificidades do SQL FULL JOINs e seus principais casos de uso no diagnóstico da integridade dos dados. Você também viu uma breve comparação entre FULL JOINs e os outros tipos de JOINs.

Para realmente entender FULL JOINs, você precisa mergulhar no fundo do poço, praticar alguns exercícios e ser desafiado. Recomendo vivamente que experimente nosso curso Cláusulas JOIN em SQL ao passar para o próximo nível deste recurso SQL muito importante.