在 SQL 中,FULL JOIN 是一种联合查询,用于返回两个表中所有匹配的行,即使其中一个表中没有匹配的行。FULL JOIN 的作用是保留两个表中的所有记录,即使没有匹配。
✅ 一、FULL JOIN 的基本语法
SELECT *
FROM table1
FULL JOIN table2
ON table1.column = table2.column;
table1 和 table2 是两个表。
ON 子句指定连接的条件。
FULL JOIN 会返回两个表中所有行,即使没有匹配。
✅ 二、FULL JOIN 的返回结果
| 表1 |
表2 |
是否匹配 |
| A |
B |
匹配 |
| A |
NULL |
不匹配 |
| NULL |
B |
不匹配 |
| NULL |
NULL |
都不匹配 |
✅ 三、FULL JOIN 与 LEFT JOIN、RIGHT JOIN 的对比
| 连接类型 |
返回的行数 |
是否保留没有匹配的行 |
LEFT JOIN |
所有表的行 |
是(保留左表的所有行) |
RIGHT JOIN |
所有表的行 |
是(保留右表的所有行) |
FULL JOIN |
所有表的行 |
是(保留两个表的所有行) |
✅ 四、使用场景
- 你想要同时查看两个表的所有数据,即使没有匹配。
- 例如:
employees 和 departments 表,即使某部门没有员工,也要显示该部门的信息。
✅ 五、示例
表结构
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE departments (
dept_id INT PRIMARY KEY,
dept_name VARCHAR(100)
);
示例数据
INSERT INTO employees (id, name) VALUES
(1, 'Alice'), (2, 'Bob'), (3, 'Charlie');
INSERT INTO departments (dept_id, dept_name) VALUES
(1, 'HR'), (2, 'IT'), (3, 'Sales');
查询 FULL JOIN
SELECT *
FROM employees
FULL JOIN departments
ON employees.id = departments.dept_id;
| id |
name |
dept_id |
dept_name |
| 1 |
Alice |
1 |
HR |
| 2 |
Bob |
2 |
IT |
| 3 |
Charlie |
3 |
Sales |
| NULL |
NULL |
1 |
HR |
| NULL |
NULL |
2 |
IT |
| NULL |
NULL |
3 |
Sales |
---
## ✅ 六、注意点
- `FULL JOIN` 是 SQL 标准中的语法,但某些数据库(如 MySQL、PostgreSQL)可能支持,而某些数据库(如 SQL Server)可能需要使用 `FULL OUTER JOIN`。
- 如果你使用的是 MySQL,可以使用 `FULL OUTER JOIN`,但语法是相同的。
---
## ✅ 七、总结
| 术语 | 说明 |
|------|------|
| `FULL JOIN` | 返回两个表中所有行,包括没有匹配的行 |
| `LEFT JOIN` | 保留左表的所有行,右表没有匹配的行会显示为 `NULL` |
| `RIGHT JOIN` | 保留右表的所有行,左表没有匹配的行会显示为 `NULL` |
| `FULL JOIN` | 保留两个表的所有行,没有匹配的行也会显示为 `NULL` |
---
如需进一步了解 `FULL JOIN` 的应用场景或与其他连接类型对比,欢迎继续提问!