SQL 基础教程
SQL 连接
SQL 高级教程
SQL 参考资料

SQL FULL JOIN 语句

在本教程中,您将学习如何使用 SQL 全联接从两个表中检索数据。

使用全连接

FULL JOIN 返回连接表中的所有行,无论它们是否匹配,即您可以说完全连接结合了 LEFT JOINRIGHT JOIN 的功能。 完全连接是 outer join 的一种,因此也称为 完全外连接

下面的维恩图说明了完全联接的工作原理。

SQL Full Join Illustration

注意: 外连接是在结果集中包含行的连接,即使被连接的两个表中的行之间可能不匹配。

为了清楚地理解这一点,让我们看看下面的 employeesdepartments 表。

+--------+--------------+------------+---------+
| 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 字段将 employeesdepartments 表连接在一起来检索所有部门以及所有员工的详细信息。

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 JOINRIGHT 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   |
+--------+--------------+------------+------------------+

如您所见,结果包括 departmentsemployees 表中的所有行。

提示: 在联接查询中,左表是出现在 JOIN 子句中最左侧的表,而右表是出现在最右侧的表。

注意: 执行外连接时,DBMS(数据库管理系统)在无法匹配任何行的地方,会在列中放置 NULL 以指示数据不存在。

Advertisements