数据库中左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)、完全外连接(FULL OUTER JOIN)的定义
外连接(Outer Join)用于查询两个表中符合条件的数据,同时保留未匹配的行,主要包括左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和完全外连接(FULL OUTER JOIN)。左外连接保留左表所有记录,右外连接保留右表所有记录,完全外连接则保留两表所有记录。MySQL不支持完全外连接,但可通过左连接和右连接的联合实现。外连接比内连接更耗资源,需谨慎
在数据库中,外连接(Outer Join) 用于查询两个表中符合条件的数据,同时保留未匹配的行。主要包括 左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)、完全外连接(FULL OUTER JOIN)。它们的核心区别在于 保留哪个表的未匹配数据。
1. 左外连接(LEFT OUTER JOIN)
- 作用:返回左表(
FROM后的表)的所有记录,以及右表中匹配的记录。 - 如果右表无匹配,则右表字段显示为
NULL。 - 语法:
(SELECT 列名 FROM 表1 LEFT OUTER JOIN 表2 ON 表1.字段 = 表2.字段;OUTER可以省略,直接写LEFT JOIN)
示例
假设有两个表:
-
employees(员工表)id name department_id 1 Alice 101 2 Bob 102 3 Carol NULL -
departments(部门表)id name 101 HR 102 Finance 103 IT
查询所有员工及其部门(即使员工没有部门):
SELECT employees.name, departments.name AS department
FROM employees
LEFT JOIN departments ON employees.department_id = departments.id;
结果:
| name | department |
|---|---|
| Alice | HR |
| Bob | Finance |
| Carol | NULL |
左表
employees的所有记录都被保留,Carol没有部门,所以department显示NULL。
2. 右外连接(RIGHT OUTER JOIN)
- 作用:返回右表(
JOIN后的表)的所有记录,以及左表中匹配的记录。 - 如果左表无匹配,则左表字段显示为
NULL。 - 语法:
(SELECT 列名 FROM 表1 RIGHT OUTER JOIN 表2 ON 表1.字段 = 表2.字段;OUTER可以省略,直接写RIGHT JOIN)
示例
查询所有部门及其员工(即使部门没有员工):
SELECT employees.name, departments.name AS department
FROM employees
RIGHT JOIN departments ON employees.department_id = departments.id;
结果:
| name | department |
|---|---|
| Alice | HR |
| Bob | Finance |
| NULL | IT |
右表
departments的所有记录都被保留,IT部门没有员工,所以name显示NULL。
3. 完全外连接(FULL OUTER JOIN)
- 作用:返回左表和右表的所有记录,无论是否匹配。
- 如果左表无匹配,右表字段显示
NULL。 - 如果右表无匹配,左表字段显示
NULL。
- 如果左表无匹配,右表字段显示
- 语法:
(SELECT 列名 FROM 表1 FULL OUTER JOIN 表2 ON 表1.字段 = 表2.字段;OUTER可以省略,直接写FULL JOIN)
示例
查询所有员工和所有部门(无论是否匹配):
SELECT employees.name, departments.name AS department
FROM employees
FULL JOIN departments ON employees.department_id = departments.id;
结果:
| name | department |
|---|---|
| Alice | HR |
| Bob | Finance |
| Carol | NULL |
| NULL | IT |
左表
employees和右表departments的所有记录都被保留,未匹配的部分用NULL填充。
对比总结
| 连接类型 | 保留左表未匹配数据 | 保留右表未匹配数据 | 典型应用场景 |
|---|---|---|---|
| LEFT JOIN | ✅ 是 | ❌ 否 | 查询主表数据,附带关联信息(如“所有员工+部门”) |
| RIGHT JOIN | ❌ 否 | ✅ 是 | 查询关联表数据,附带主表信息(较少使用) |
| FULL JOIN | ✅ 是 | ✅ 是 | 需要完整查看两表数据(如数据比对) |
注意事项
- MySQL 不支持
FULL JOIN,但可以通过LEFT JOIN + RIGHT JOIN + UNION实现:SELECT * FROM employees LEFT JOIN departments ON ... UNION SELECT * FROM employees RIGHT JOIN departments ON ...; - 性能:外连接比内连接(
INNER JOIN)更耗资源,尽量避免在大表上使用。 NULL处理:外连接可能产生NULL,查询时需用IS NULL或COALESCE()处理。
总结
- 左外连接 → 保留左表所有数据(常用)。
- 右外连接 → 保留右表所有数据(较少用,通常可用左连接替代)。
- 完全外连接 → 保留两表所有数据(适合数据比对)。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)