SQL FULL JOIN 語句
在本教程中,你將學習如何使用 SQL 完全連線從兩個表中檢索資料。
使用完全連線
FULL JOIN
返回連線表中的所有行,無論它們是否匹配,即可以說完全連線組合了 LEFT JOIN
和 RIGHT JOIN
的功能。完全連線是一種外連線,這就是為什麼它也被稱為完全外連線。
以下維恩圖說明了完整連線的工作原理。
注意: 外連線是包含結果集中的行的連線,即使要連線的兩個表中的行之間可能不匹配。
為了清楚地理解這一點,讓我們看看以下 employees 和 departments 表。
Table: employees
+--------+--------------+------------+---------+
| 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 |
+--------+--------------+------------+---------+
Table: departments
+---------+------------------+
| dept_id | dept_name |
+---------+------------------+
| 1 | Administration |
| 2 | Customer Service |
| 3 | Finance |
| 4 | Human Resources |
| 5 | Sales |
+---------+------------------+
現在,假設你只想檢索所有員工的姓名和可用部門的名稱,無論他們在另一個表中是否有相應的行,在這種情況下你可以使用完整的聯接,如下所示。
以下語句通過使用公共 dept_id 欄位將 employees 和 departments 表連線在一起來檢索所有部門以及所有員工的詳細資訊。
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
以指示資料不存在。