English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Neste tutorial, você aprenderá como usar SQL Full Join para recuperar dados de duas tabelas.
FULL JOIN retorna todas as linhas das tabelas JOINadas, independentemente de elas coincidirem, o que significa que o JOIN completo combina LEFT JOINeRIGHT JOINfunção. O JOIN completo éum tipo de JOIN externoportanto, também conhecido comofull outer join.
O diagrama de Venn a seguir ilustra como o JOIN completo funciona.
Atenção:Um JOIN externo é um JOIN que inclui linhas no resultado, mesmo que as linhas das duas tabelas a serem JOINadas possam não coincidir.
Para entender isso claramente, vamos olhar para a seguinteemployeesedepartmentsTabela.
+--------+--------------+------------+---------+ | emp_id | emp_name | hire_date | dept_id | +--------+--------------+------------+---------+ | 1 | Ethan Hunt | 2001-05-01 | 4 | | 2 | Tony Montana | 2002-07-15 | 1 | | 3 | Sarah Connor | 2005-10-18 | 5 | | 4 | Rick Deckard | 2007-01-03 | 3 | | 5 | Martin Blank | 2008-06-24 | NULL | +--------+--------------+------------+---------+ | +---------+------------------+ | dept_id | dept_name | +---------+------------------+ | 1 | Administration | | 2 | Customer Service | | 3 | Finance | | 4 | Human Resources | | 5 | Sales | +---------+------------------+ | |
Tabela: employees | Tabela: departments |
Agora, suponha que você queira recuperar o nome de todos os funcionários e o nome dos departamentos disponíveis, independentemente de haverem linhas correspondentes na outra tabela. Neste caso, você pode usar JOIN completo, conforme mostrado a seguir.
A seguinte consulta conecta as tabelas employee e department usando o campo dept_id genérico para obter detalhes de todos os departamentos e todos os funcionários.
SELECT t1.emp_id, t1.emp_name, t1.hire_date, t2.dept_name FROM employees AS t1 FULL JOIN departments AS t2 ON t1.dept_id = t2.dept_id ORDER BY emp_name;
Alguns bancos de dados (por exemplo, Oracle, MySQL) não suportam JOIN completo. Neste caso, você pode usar o operador UNION ALL para combinar LEFT JOIN e RIGHT JOIN, conforme mostrado a seguir:
SELECT t1.emp_id, t1.emp_name, t1.hire_date, t2.dept_name FROM employees AS t1 LEFT JOIN departments AS t2 ON t1.dept_id = t2.dept_id UNION ALL SELECT t1.emp_id, t1.emp_name, t1.hire_date, t2.dept_name FROM employees AS t1 RIGHT JOIN departments AS t2 ON t1.dept_id = t2.dept_id ORDER BY emp_name;
Após executar o comando acima, você obterá a seguinte saída:
+--------+--------------+------------+------------------+ | emp_id | emp_name | hire_date | dept_name | +--------+--------------+------------+------------------+ | NULL | NULL | NULL | Customer Service | | 1 | Ethan Hunt | 2001-05-01 | Human Resources | | 1 | Ethan Hunt | 2001-05-01 | Human Resources | | 5 | Martin Blank | 2008-06-24 | NULL | | 4 | Rick Deckard | 2007-01-03 | Finance | | 4 | Rick Deckard | 2007-01-03 | Finance | | 3 | Sarah Connor | 2005-10-18 | Sales | | 3 | Sarah Connor | 2005-10-18 | Sales | | 2 | Tony Montana | 2002-07-15 | Administration | | 2 | Tony Montana | 2002-07-15 | Administration | +--------+--------------+------------+------------------+
Como você vê, o resultado incluidepartmentseemployeesTodas as linhas da tabela.
Dica:Em consultas de junção, a tabela esquerda é a que aparece mais à esquerda no sublinhado JOIN, e a tabela direita é a que aparece mais à direita no sublinhado JOIN.
Atenção:Quando executar junções externas, se o DBMS (Sistema de Gestão de Banco de Dados) não puder coincidir com nenhuma linha, ele colocará NULL na coluna para indicar que os dados não existem.