在数据库中,外连接(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()
处理。
总结
- 左外连接 → 保留左表所有数据(常用)。
- 右外连接 → 保留右表所有数据(较少用,通常可用左连接替代)。
- 完全外连接 → 保留两表所有数据(适合数据比对)。