20th Jul 2022 7 minutos de leitura O que é o FULL JOIN e quando utilizá-lo Zahin Rahman sql aprender sql sql joins Índice COMPLETO: Uma Introdução Sintaxe FULL JOIN Exemplo Casos de uso de adesão completa Tipos de JOINs: Recapitulação Aumente seu conhecimento sobre SQL FULL JOINs 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. 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. Tags: sql aprender sql sql joins