Skip to content

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 表

idnameagegrade
1张三18高三
2李四17高二
3王五19高三
4赵六16高一
5钱七18高三

scores 表

idstudent_idsubjectscore
11数学90
21语文85
32数学95
42语文88
53数学80
66数学75
76语文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;

结果:

idnamesubjectscore
1张三数学90
1张三语文85
2李四数学95
2李四语文88
3王五数学80
NULLNULL数学75
NULLNULL语文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;

结果:

idstudent_idsubjectscore
66数学75
76语文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;

结果:

学生姓名subjectscore
张三数学90
张三语文85
李四数学95
李四语文88
王五数学80
未知学生数学75
未知学生语文82

注意事项

  1. 左表和右表:在 RIGHT JOIN 中,table1 是左表,table2 是右表。右表中的所有记录都会被返回,无论左表中是否有匹配的记录。

  2. NULL 值:当左表中没有匹配的记录时,左表的列会返回 NULL。

  3. WHERE 子句与 ON 子句:在 RIGHT JOIN 中,连接条件应该放在 ON 子句中,而不是 WHERE 子句中。如果将连接条件放在 WHERE 子句中,RIGHT JOIN 会变成 INNER JOIN。

  4. 性能考虑:对于大型表,RIGHT JOIN 可能会影响查询性能。为了提高性能,应该确保连接的列上有索引。

  5. 与 LEFT JOIN 的关系:RIGHT JOIN 可以通过交换表的顺序转换为 LEFT JOIN。例如,A RIGHT JOIN B 等价于 B LEFT JOIN A

小结

SQL RIGHT JOIN 是一种常用的连接类型,它返回右表中的所有记录和左表中匹配的记录。当需要查询右表中的所有记录,无论左表中是否有匹配的记录时,RIGHT JOIN 非常有用。