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

SQL LEFT JOIN 操作

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

使用左连接

LEFT JOIN 语句返回左表中的所有行以及右表中满足连接条件的行。 左连接是一种 outer join,因此也称为 左外连接。 外连接的其他变体是 right joinfull join

下面的维恩图说明了左连接的工作原理。

SQL 左连接图

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

为了清楚地理解这一点,让我们看看下面的 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

现在,假设您要检索所有员工的 ID、姓名和入职日期以及他们所在部门的名称,无论他们是否被分配到任何部门。 要获得这种类型的结果集,我们需要应用左连接。

以下语句通过使用公共 dept_id 字段将 employeesdepartments 表连接在一起来检索员工的 id、姓名、招聘日期及其部门名称。 它还包括那些未分配到部门的员工。

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 ORDER BY emp_id;

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

执行上述命令后,您将获得如下输出:

+--------+--------------+------------+-----------------+
| emp_id | emp_name     | hire_date  | dept_name       |
+--------+--------------+------------+-----------------+
|      1 | Ethan Hunt   | 2001-05-01 | Human Resources |
|      2 | Tony Montana | 2002-07-15 | Administration  |
|      3 | Sarah Connor | 2005-10-18 | Sales           |
|      4 | Rick Deckard | 2007-01-03 | Finance         |
|      5 | Martin Blank | 2008-06-24 | NULL            |
+--------+--------------+------------+-----------------+

如您所见,左连接包括结果集中 employees 表中的所有行,无论 departments 表中的 dept_id 列是否匹配。

注意:如果左表中有一行但右表没有匹配,则关联的结果行包含来自右表的所有列的 NULL 值。

Advertisements