CodeGym /课程 /SQL SELF /`RIGHT JOIN` 及其用法

`RIGHT JOIN` 及其用法

SQL SELF
第 11 级 , 课程 3
可用

咱们先来搞清楚定义。RIGHT JOIN 是一种连接类型,它会返回 右表 的所有行(所以才叫“右”),左表只返回匹配的行。如果左表没有和右表对应的数据,那左表的字段就会显示 NULL

你应该已经见过 LEFT JOIN,其实它俩差不多,只不过是“镜像”关系。主要区别就是哪张表算主表:左还是右。

RIGHT JOIN 的语法

RIGHT JOIN 的语法和 LEFT JOIN 基本一样。结构如下:

SELECT
    列名
FROM 
    左表 RIGHT JOIN 右表
ON 
    连接条件;

注意表的顺序:

  1. 左表 写在 RIGHT JOIN 前面;
  2. 右表 写在 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 JOINLEFT JOIN 的对比

如果你已经明白 LEFT JOIN 怎么用,可能会想:“那我为啥还要 RIGHT JOIN?直接用 LEFT JOIN 不行吗?”好问题!咱们来聊聊区别,以及什么时候用 RIGHT JOIN 更合适。

  1. 数据方向

    • LEFT JOIN:返回 左表 的所有行,不管右表有没有匹配。
    • RIGHT JOIN:返回 右表 的所有行,就算左表没匹配也会显示。
  2. 主表选择 通常你会根据哪张表更重要、写 SQL 时顺手来选 LEFT 还是 RIGHT

  3. 等价性 任何 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 的时候,大家经常会踩这些坑:

  1. 忘了写 ON 连接条件。不写条件会变成笛卡尔积,结果一团乱。
  2. RIGHT JOINLEFT JOIN 搞混。表顺序写错,结果就错了。
  3. 没处理 NULL。用 RIGHT JOIN 经常会查出 NULL,要么理解它,要么用 COALESCE() 处理下。

就这些啦!现在你已经会用 RIGHT JOIN,知道它和 LEFT JOIN 的区别,也能选对连接类型了。下节课我们会聊聊 FULL OUTER JOIN,把两张表的 所有内容 都合起来。祝你写 SQL 顺利!

2
任务
SQL SELF, 第 11 级, 课程 3
已锁定
简单使用 `RIGHT JOIN`
简单使用 `RIGHT JOIN`
2
任务
SQL SELF, 第 11 级, 课程 3
已锁定
使用 `RIGHT JOIN` 进行筛选
使用 `RIGHT JOIN` 进行筛选
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION