咱们先来搞清楚定义。RIGHT JOIN 是一种连接类型,它会返回 右表 的所有行(所以才叫“右”),左表只返回匹配的行。如果左表没有和右表对应的数据,那左表的字段就会显示 NULL。
你应该已经见过 LEFT JOIN,其实它俩差不多,只不过是“镜像”关系。主要区别就是哪张表算主表:左还是右。
RIGHT JOIN 的语法
RIGHT JOIN 的语法和 LEFT JOIN 基本一样。结构如下:
SELECT
列名
FROM
左表 RIGHT JOIN 右表
ON
连接条件;
注意表的顺序:
- 左表 写在
RIGHT JOIN前面; - 右表 写在
RIGHT JOIN后面。
假设我们有两张表:
students —— 学生名单:
| student_id | name |
|---|---|
| 1 | Otto |
| 2 | Maria |
| 3 | Alex |
enrollments —— 学生选课记录:
| enrollment_id | course_name | student_id |
|---|---|---|
| 101 | 数学 | 1 |
| 102 | 信息学 | 2 |
| 103 | 生物学 | NULL |
现在我们想查出所有选课记录,同时带上学生信息(如果有的话)。如果找不到学生,就会显示 NULL。
用 RIGHT JOIN 的查询长这样:
SELECT
enrollments.enrollment_id,
enrollments.course_name,
students.name AS student_name
FROM
students RIGHT JOIN enrollments
ON
students.student_id = enrollments.student_id;
结果:
| enrollment_id | course_name | student_name |
|---|---|---|
| 101 | 数学 | Otto |
| 102 | 信息学 | Maria |
| 103 | 生物学 | NULL |
你可以看到,enrollments(右表)里的所有记录都查出来了,就算 students(左表)里没有对应的学生也没关系。
RIGHT JOIN 和 LEFT JOIN 的对比
如果你已经明白 LEFT JOIN 怎么用,可能会想:“那我为啥还要 RIGHT JOIN?直接用 LEFT JOIN 不行吗?”好问题!咱们来聊聊区别,以及什么时候用 RIGHT JOIN 更合适。
数据方向
LEFT JOIN:返回 左表 的所有行,不管右表有没有匹配。RIGHT JOIN:返回 右表 的所有行,就算左表没匹配也会显示。
主表选择 通常你会根据哪张表更重要、写 SQL 时顺手来选
LEFT还是RIGHT。等价性 任何
RIGHT JOIN都能换成LEFT JOIN,只要把表顺序调一下。比如:-- RIGHT JOIN SELECT * FROM students RIGHT JOIN enrollments ON students.student_id = enrollments.student_id; -- 等价的 LEFT JOIN SELECT * FROM enrollments LEFT JOIN students ON students.student_id = enrollments.student_id;
所以,如果你不喜欢 RIGHT JOIN,完全可以不用它!
什么时候用 RIGHT JOIN?
实际开发里 RIGHT JOIN 用得没 LEFT JOIN 多。但有些场景它挺方便:
- 右表更重要(比如它是你的主表);
- 你想让 SQL 语句顺着逻辑顺序写,右表放后面更顺手;
- 你在维护别人写的代码,里面本来就用
RIGHT JOIN。
RIGHT JOIN 的可视化理解
为了更直观地理解 RIGHT JOIN,来看看这个图:
左表 右表
[ A ] --------> [ 1 ]
[ B ] --------> [ 2 ]
[ C ] --------> [ 3 ]
[ D ] [ 4 ]
用 RIGHT JOIN 时,右表的所有值都会查出来,左表能匹配的就带上,不能匹配的就 NULL。
实战练习
来试试你的理解。题目如下:
你有两张表 departments(部门)和 employees(员工):departments:
| department_id | department_name |
|---|---|
| 1 | IT |
| 2 | 销售 |
| 3 | 财务 |
employees:
| employee_id | name | department_id |
|---|---|---|
| 101 | Peter | 1 |
| 102 | Eva | 2 |
| 103 | Ron | NULL |
写个 RIGHT JOIN 查询,把所有部门都查出来,带上员工(如果有),没有员工就显示 NULL。
建议你先自己写写看,再看答案。
练习答案
查询长这样:
SELECT
departments.department_name,
employees.name AS employee_name
FROM employees RIGHT JOIN departments
ON employees.department_id = departments.department_id;
结果如下:
| department_name | employee_name |
|---|---|
| IT | Peter |
| 销售 | Eva |
| 财务 | NULL |
用 RIGHT JOIN 时常见的坑
刚学 RIGHT JOIN 的时候,大家经常会踩这些坑:
- 忘了写
ON连接条件。不写条件会变成笛卡尔积,结果一团乱。 - 把
RIGHT JOIN和LEFT JOIN搞混。表顺序写错,结果就错了。 - 没处理
NULL值。用RIGHT JOIN经常会查出NULL,要么理解它,要么用COALESCE()处理下。
就这些啦!现在你已经会用 RIGHT JOIN,知道它和 LEFT JOIN 的区别,也能选对连接类型了。下节课我们会聊聊 FULL OUTER JOIN,把两张表的 所有内容 都合起来。祝你写 SQL 顺利!
GO TO FULL VERSION