English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
In questo tutorial, imparerai come utilizzare l'unione completa SQL per recuperare dati da due tabelle.
FULL JOIN restituisce tutte le righe della tabella di unione, indipendentemente dal fatto che corrispondano o meno, quindi si può dire che un'unione completa combina LEFT JOIN和RIGHT JOINUn'unione completa èuna funzione dell'unione esterna.quindi anche chiamatafull outer join
Il diagramma di Venn sottostante spiega come funziona un'unione esterna completa.
注意:Un'unione esterna è un'unione che include righe nel risultato, anche se le righe delle due tabelle da unire potrebbero non corrispondere.
Per comprendere chiaramente questo, diamo un'occhiata a quanto segueemployees和departments表。
+--------+--------------+------------+---------+ | 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 | +---------+------------------+ | |
表: employees | 表: departments |
现在,假设您只想检索所有雇员的姓名和可用部门的名称,而不管他们在另一张表中是否有对应的行,在这种情况下,您可以使用完全联接,如下所示。
以下语句通过使用通用的dept_id字段将employee和department表连接在一起来检索所有部门以及所有雇员的详细信息。
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;
某些数据库(例如Oracle,MySQL)不支持完全连接。在这种情况下,您可以使用UNION ALL运算符来组合LEFT JOIN和RIGHT JOIN,如下所示:
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;
执行上述命令后,您将获得如下输出:
+--------+--------------+------------+------------------+ | 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 | +--------+--------------+------------+------------------+
正如您所看到的,结果包括departments和employees表中的所有行。
提示:在联接查询中,左表是该JOIN子句中最左侧出现的表,而右表是该子句中最右侧出现的表。
注意:当执行外部联接时,只要数据库管理系统(DBMS)无法匹配任何行,它将在列中放置NULL来指示数据不存在。