在SQL中,左连接(LEFT JOIN) 和 右连接(RIGHT JOIN) 是两种常见的连接操作,通常用于从两个表中检索数据。它们的区别主要体现在结果集中的行如何被匹配以及哪个表的数据会被保留。
定义: 左连接(也叫左外连接)是将左表(LEFT JOIN
中的第一个表)的所有记录与右表(LEFT JOIN
中的第二个表)中符合连接条件的记录进行匹配。如果右表中没有符合条件的记录,左表中的记录仍然会出现在结果中,右表的相关字段则会显示为 NULL
。
结果集: 左表的所有记录都会出现在结果集中,如果右表有符合条件的记录,则将右表的相关字段一起返回。如果右表没有匹配的记录,右表的字段为 NULL
。
使用场景: 当你希望保留左表的所有数据,即使右表没有匹配数据时,也能显示左表的数据。
假设有两个表:employees
(员工表)和 departments
(部门表)。
employees 表:
id | name | department_id |
---|---|---|
1 | Alice | 1 |
2 | Bob | 2 |
3 | Charlie | 3 |
4 | David | NULL |
departments 表:
id | department_name |
---|---|
1 | HR |
2 | IT |
3 | Finance |
查询员工及其部门信息:
sqlSELECT e.id, e.name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.id;
结果集:
id | name | department_name |
---|---|---|
1 | Alice | HR |
2 | Bob | IT |
3 | Charlie | Finance |
4 | David | NULL |
如你所见,David
这位员工没有关联部门,因此 department_name
为 NULL
。
定义: 右连接(也叫右外连接)与左连接相似,只不过它保留的是右表(RIGHT JOIN
中的第二个表)的所有记录,并且会与左表(RIGHT JOIN
中的第一个表)中符合连接条件的记录进行匹配。如果左表中没有符合条件的记录,右表中的记录仍然会出现在结果中,左表的相关字段则会显示为 NULL
。
结果集: 右表的所有记录都会出现在结果集中,如果左表有符合条件的记录,则将左表的相关字段一起返回。如果左表没有匹配的记录,左表的字段为 NULL
。
使用场景: 当你希望保留右表的所有数据,即使左表没有匹配数据时,也能显示右表的数据。
继续使用 employees
和 departments
表。
sqlSELECT e.id, e.name, d.department_name
FROM employees e
RIGHT JOIN departments d ON e.department_id = d.id;
结果集:
id | name | department_name |
---|---|---|
1 | Alice | HR |
2 | Bob | IT |
3 | Charlie | Finance |
NULL | NULL | NULL |
注意,在右连接中,如果右表(departments
)中的某些记录没有匹配到左表(employees
)中的记录,那么左表的字段将会返回 NULL
。例如,假如右表 departments
中有一个部门没有员工,那么结果集会显示该部门的相关信息,并且员工相关字段为 NULL
。
特性 | 左连接(LEFT JOIN) | 右连接(RIGHT JOIN) |
---|---|---|
结果集 | 保留左表(第一个表)的所有记录 | 保留右表(第二个表)的所有记录 |
无匹配时表现 | 如果右表没有匹配的记录,右表的字段为 NULL | 如果左表没有匹配的记录,左表的字段为 NULL |
使用场景 | 当你需要保留左表的所有数据 | 当你需要保留右表的所有数据 |
查询行为 | 查找左表所有数据,并与右表匹配 | 查找右表所有数据,并与左表匹配 |
语法上的差异: 左连接和右连接的最大区别在于结果集中保留的表的顺序。左连接会保留左表的所有记录,右连接会保留右表的所有记录。
逻辑上的等价性: 其实,左连接和右连接是可以互相转换的。我们可以通过交换表的位置来将右连接转换为左连接,反之亦然。例如:
sql-- 使用右连接
SELECT * FROM employees e
RIGHT JOIN departments d ON e.department_id = d.id;
-- 等价于使用左连接
SELECT * FROM departments d
LEFT JOIN employees e ON e.department_id = d.id;
NULL
。NULL
。本文作者:han
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!