Appearance
SQL RIGHT JOIN
SQL RIGHT JOIN 是一种连接类型,它返回右表中的所有记录和左表中匹配的记录。如果左表中没有匹配的记录,则返回 NULL。
语法
sql
SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;示例
假设我们有以下两个表:
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:基本 RIGHT JOIN
查询所有成绩及其对应的学生(如果有的话):
sql
SELECT students.id, students.name, scores.subject, scores.score
FROM students
RIGHT JOIN scores ON students.id = scores.student_id;结果:
| id | name | subject | score |
|---|---|---|---|
| 1 | 张三 | 数学 | 90 |
| 1 | 张三 | 语文 | 85 |
| 2 | 李四 | 数学 | 95 |
| 2 | 李四 | 语文 | 88 |
| 3 | 王五 | 数学 | 80 |
| NULL | NULL | 数学 | 75 |
| NULL | NULL | 语文 | 82 |
示例 2:使用表别名
为表指定别名,简化查询语句:
sql
SELECT s.id, s.name, sc.subject, sc.score
FROM students AS s
RIGHT JOIN scores AS sc ON s.id = sc.student_id;结果与示例 1 相同。
示例 3:添加 WHERE 子句
查询没有对应学生的成绩:
sql
SELECT sc.id, sc.student_id, sc.subject, sc.score
FROM students AS s
RIGHT JOIN scores AS sc ON s.id = sc.student_id
WHERE s.id IS NULL;结果:
| id | student_id | subject | score |
|---|---|---|---|
| 6 | 6 | 数学 | 75 |
| 7 | 6 | 语文 | 82 |
示例 4:使用 COALESCE 函数处理 NULL 值
查询所有成绩及其对应的学生姓名,如果没有对应学生则显示 '未知学生':
sql
SELECT COALESCE(s.name, '未知学生') AS 学生姓名, sc.subject, sc.score
FROM students AS s
RIGHT JOIN scores AS sc ON s.id = sc.student_id;结果:
| 学生姓名 | subject | score |
|---|---|---|
| 张三 | 数学 | 90 |
| 张三 | 语文 | 85 |
| 李四 | 数学 | 95 |
| 李四 | 语文 | 88 |
| 王五 | 数学 | 80 |
| 未知学生 | 数学 | 75 |
| 未知学生 | 语文 | 82 |
注意事项
左表和右表:在 RIGHT JOIN 中,
table1是左表,table2是右表。右表中的所有记录都会被返回,无论左表中是否有匹配的记录。NULL 值:当左表中没有匹配的记录时,左表的列会返回 NULL。
WHERE 子句与 ON 子句:在 RIGHT JOIN 中,连接条件应该放在 ON 子句中,而不是 WHERE 子句中。如果将连接条件放在 WHERE 子句中,RIGHT JOIN 会变成 INNER JOIN。
性能考虑:对于大型表,RIGHT JOIN 可能会影响查询性能。为了提高性能,应该确保连接的列上有索引。
与 LEFT JOIN 的关系:RIGHT JOIN 可以通过交换表的顺序转换为 LEFT JOIN。例如,
A RIGHT JOIN B等价于B LEFT JOIN A。
小结
SQL RIGHT JOIN 是一种常用的连接类型,它返回右表中的所有记录和左表中匹配的记录。当需要查询右表中的所有记录,无论左表中是否有匹配的记录时,RIGHT JOIN 非常有用。