Appearance
SQL FULL JOIN
SQL FULL JOIN 是一种连接类型,它返回两个表中的所有记录。如果其中一个表中没有匹配的记录,则返回 NULL。
语法
sql
SELECT column_name(s)
FROM table1
FULL JOIN table2
ON table1.column_name = table2.column_name;注意事项
- MySQL 不支持 FULL JOIN:MySQL 数据库不直接支持 FULL JOIN 操作,但可以使用 UNION 操作来模拟 FULL JOIN。
- SQL Server 和 PostgreSQL 支持 FULL JOIN:SQL Server 和 PostgreSQL 等数据库系统支持 FULL JOIN 操作。
示例
假设我们有以下两个表:
students 表
| id | name | age | grade |
|---|---|---|---|
| 1 | 张三 | 18 | 高三 |
| 2 | 李四 | 17 | 高二 |
| 3 | 王五 | 19 | 高三 |
| 4 | 赵六 | 16 | 高一 |
| 5 | 钱七 | 18 | 高三 |
scores 表
| id | student_id | subject | score |
|---|---|---|---|
| 1 | 1 | 数学 | 90 |
| 2 | 1 | 语文 | 85 |
| 3 | 2 | 数学 | 95 |
| 4 | 2 | 语文 | 88 |
| 5 | 3 | 数学 | 80 |
| 6 | 6 | 数学 | 75 |
| 7 | 6 | 语文 | 82 |
示例 1:基本 FULL JOIN
查询所有学生和所有成绩,匹配的显示对应数据,不匹配的显示 NULL:
sql
SELECT students.id, students.name, scores.subject, scores.score
FROM students
FULL JOIN scores ON students.id = scores.student_id;结果:
| id | name | subject | score |
|---|---|---|---|
| 1 | 张三 | 数学 | 90 |
| 1 | 张三 | 语文 | 85 |
| 2 | 李四 | 数学 | 95 |
| 2 | 李四 | 语文 | 88 |
| 3 | 王五 | 数学 | 80 |
| 4 | 赵六 | NULL | NULL |
| 5 | 钱七 | NULL | NULL |
| NULL | NULL | 数学 | 75 |
| NULL | NULL | 语文 | 82 |
示例 2:在 MySQL 中模拟 FULL JOIN
由于 MySQL 不支持 FULL JOIN,我们可以使用 LEFT JOIN 和 RIGHT JOIN 的 UNION 来模拟:
sql
SELECT students.id, students.name, scores.subject, scores.score
FROM students
LEFT JOIN scores ON students.id = scores.student_id
UNION
SELECT students.id, students.name, scores.subject, scores.score
FROM students
RIGHT JOIN scores ON students.id = scores.student_id
WHERE students.id IS NULL;结果与示例 1 相同。
注意事项
NULL 值:当其中一个表中没有匹配的记录时,对应的列会返回 NULL。
性能考虑:对于大型表,FULL JOIN 可能会影响查询性能,因为它需要处理两个表中的所有记录。
使用场景:FULL JOIN 通常用于需要同时查看两个表中所有记录的场景,例如比较两个表的数据差异。
小结
SQL FULL JOIN 是一种连接类型,它返回两个表中的所有记录。当需要查询两个表中的所有记录,无论它们是否匹配时,FULL JOIN 非常有用。需要注意的是,MySQL 数据库不直接支持 FULL JOIN 操作,但可以使用 UNION 操作来模拟。