Entender SQL muitas vezes é saber fazer as perguntas certas. Quando você lida com dados espalhados por várias tabelas, a operação full outer join se torna inegavelmente útil. Embora seja bastante comum em alguns sistemas de gerenciamento de banco de dados, o conceito de FULL OUTER JOIN é um pouco mais complicado no MySQL. Por quê? Porque ele não é suportado nativamente. Interessante, não é? Mas calma, existe uma solução alternativa!
Neste tutorial, vamos explorar em detalhes como implementar um full outer join no MySQL. Apertem os cintos, pessoal. Vamos mergulhar em uma piscina de exemplos de código.
🔖 Referência rápida: Precisa consultar rapidamente todos os tipos de JOIN? Confira nossa Cheat Sheet de SQL JOIN com diagramas visuais e exemplos de código.
O que é um Full Outer Join?
Antes de começar, vamos definir o que é um FULL OUTER JOIN. Em SQL, um full outer join combina o efeito de aplicar tanto o left outer join quanto o right outer join. Em outras palavras, ele busca os registros com valores correspondentes nas duas tabelas, além de todos os registros de ambas as tabelas cujos valores não aparecem na outra tabela.
Veja um exemplo. Vamos supor que temos duas tabelas, Employees e Departments.
Tabela Employees:
| id | name |
|---|---|
| 1 | Alice |
| 2 | Bob |
| 3 | Charlie |
Tabela Departments:
| id | department |
|---|---|
| 2 | HR |
| 3 | IT |
| 4 | Marketing |
Usando a consulta FULL OUTER JOIN:
SELECT * FROM Employees
FULL OUTER JOIN Departments ON Employees.id = Departments.id;
O resultado será:
| Employees.id | Employees.name | Departments.id | Departments.department |
|---|---|---|---|
| 1 | Alice | NULL | NULL |
| 2 | Bob | 2 | HR |
| 3 | Charlie | 3 | IT |
| NULL | NULL | 4 | Marketing |
Esse resultado combina todos os registros de Employees e Departments. Ele inclui:
- Registros com valores de
idcorrespondentes nas duas tabelas (Bob e Charlie). - Registros de
Employeessem registro correspondente emDepartments(Alice). - Registros de
Departmentssem registro correspondente emEmployees(Marketing).
Apesar de muito útil, essa sintaxe não é suportada diretamente no MySQL. Então, qual é a saída? Vamos descobrir.
Simulando um Full Outer Join no MySQL
Como mencionado acima, o MySQL não suporta explicitamente a palavra-chave FULL OUTER JOIN. No entanto, ainda podemos obter o resultado desejado usando uma combinação de LEFT JOIN e UNION
A ideia por trás da simulação de um full outer join no MySQL envolve duas etapas:
- Fazer um
LEFT JOINa partir da primeira tabela para obter todos os registros dela, junto com os registros correspondentes da segunda tabela. - Usar
UNIONpara combinar os resultados com o resultado de umRIGHT JOIN, obtendo todos os registros da segunda tabela junto com os registros correspondentes da primeira.
Veja como cada componente funciona:
Left Join:
Right Join:
Exemplo de Full Outer Join no MySQL
Aqui está um exemplo da solução alternativa usando os mesmos dados de antes
SELECT
Employees.id AS Employees_id,
Employees.name,
Departments.id AS Departments_id,
Departments.department
FROM
Employees
LEFT JOIN
Departments ON Employees.id = Departments.id
UNION
SELECT
Employees.id AS Employees_id,
Employees.name,
Departments.id AS Departments_id,
Departments.department
FROM
Departments
RIGHT JOIN
Employees ON Departments.id = Employees.id;
Essa consulta tem duas partes:
- Um
LEFT JOINpara obter todos os registros da tabelaEmployeese os registros correspondentes da tabelaDepartments. - Um
RIGHT JOINpara obter todos os registros da tabelaDepartmentse os registros correspondentes da tabelaEmployees.
O UNION combina os resultados dessas duas consultas, eliminando linhas duplicadas.
Com as mesmas tabelas de exemplo, o resultado será:
| Employees_id | name | Departments_id | department |
|---|---|---|---|
| 1 | Alice | NULL | NULL |
| 2 | Bob | 2 | HR |
| 3 | Charlie | 3 | IT |
| NULL | NULL | 4 | Marketing |
Esse resultado, assim como o FULL OUTER JOIN em SQL, combina todos os registros de Employees e Departments.
UNION filtra duplicatas automaticamente
No caso específico do nosso exemplo com as tabelas Employees e Departments, o UNION usado na solução alternativa do MySQL para um FULL OUTER JOIN não gera duplicatas. Isso acontece porque o operador UNION elimina automaticamente as linhas duplicadas do seu resultado.
Para esclarecer, vamos ver como o UNION funciona nesse contexto:
-
A primeira parte da consulta (o
LEFT JOIN) busca todos os registros da tabela Employees e os registros correspondentes da tabela Departments. Isso inclui linhas com valores de id correspondentes nas duas tabelas e linhas de Employees sem correspondência em Departments. -
A segunda parte da consulta (o
RIGHT JOIN) busca todos os registros da tabela Departments e os registros correspondentes da tabela Employees. Isso inclui linhas com valores de id correspondentes nas duas tabelas e linhas de Departments sem correspondência em Employees.
Como o UNION remove duplicatas, as linhas com valores de id correspondentes (aquelas que apareceriam tanto no resultado do LEFT JOIN quanto no do RIGHT JOIN) aparecerão apenas uma vez no resultado final.
Em resumo, usar UNION nesse contexto garante que cada combinação única de dados de Employees e Departments apareça apenas uma vez no resultado, imitando assim o comportamento de um FULL OUTER JOIN sem duplicatas.
Pratique no Beekeeper Studio
Espero que este tutorial de full outer join no MySQL tenha sido útil para você. Em próximos posts, continuaremos explorando outros recursos avançados do MySQL, compartilhando mais exemplos de código e nos aprofundando em por que e como esses recursos funcionam. Até lá, continue praticando suas habilidades em SQL, de preferência usando o Beekeeper Studio.
Beekeeper Studio é um cliente de banco de dados gratuito e open source
A melhor ferramenta de consultas e edição de SQL que já usei. Tem tudo o que preciso para gerenciar meu banco de dados. - ⭐⭐⭐⭐⭐ Mit
O Beekeeper Studio é rápido, intuitivo e fácil de usar. Ele suporta vários bancos de dados e funciona muito bem no Windows, Mac e Linux.
O que os usuários dizem sobre o Beekeeper Studio
"O Beekeeper Studio substituiu completamente meu antigo fluxo de trabalho com SQL. É rápido, intuitivo e torna o trabalho com banco de dados agradável de novo."
"Já testei várias GUIs de banco de dados, mas o Beekeeper encontra o equilíbrio perfeito entre recursos e simplicidade. Simplesmente funciona."