mysql菜鸟教程

专栏导航

11.4 右连接(RIGHT JOIN)

      右连接是左连接的“镜像”,它返回右表中的所有记录,以及左表中满足连接条件的记录。如果左表中没有匹配,则左表对应的列填充为 NULL。虽然右连接在功能上与左连接对称,但在实际开发中,左连接的使用频率远高于右连接,因为我们可以通过交换表的顺序用左连接实现相同的效果。不过,了解右连接有助于全面理解 SQL 连接。

一、基本语法

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

其中 OUTER 可以省略,通常直接写 RIGHT JOIN

二、基础示例:所有班级及其学生

沿用之前的 students 和 classes 表:

students(左表)

student_id

name

class_id

1

张三

101

2

李四

102

3

王五

101

4

赵六

NULL

classes(右表)

class_id

class_name


101

计算机1班


102

软件2班


103

网络3班

-- 新增加一个没有学生的班级

现在,我们想列出所有班级及其学生,即使某些班级目前还没有学生。使用右连接:

SELECT s.name, c.class_name
FROM students s
RIGHT JOIN classes c ON s.class_id = c.class_id;

结果

name

class_name

张三

计算机1班

王五

计算机1班

李四

软件2班

NULL

网络3班

结果解读

  • 班级 101(计算机1班)有学生张三和王五,所以显示两行。

  • 班级 102(软件2班)有学生李四,显示一行。

  • 班级 103(网络3班)没有学生,因此右表记录被保留,左表部分显示 NULL。

三、用左连接实现相同效果

上述查询完全可以通过左连接交换表顺序来实现:

SELECT s.name, c.class_name
FROM classes c
LEFT JOIN students s ON c.class_id = s.class_id;

结果完全相同。因此,在实际开发中,通常推荐统一使用左连接,以保持代码风格一致,避免混淆。

四、ON 与 WHERE 的注意事项

与左连接一样,右连接中 ON 和 WHERE 的作用时机也很重要。

  • ON 在连接阶段使用,用于确定如何匹配行。

  • WHERE 在连接完成后应用,用于过滤最终结果。

例如,如果只想显示班级名称以“计算机”开头的班级及其学生(仍保留所有此类班级,即使无学生),条件应放在 ON 中:

SELECT s.name, c.class_name
FROM students s
RIGHT JOIN classes c ON s.class_id = c.class_id AND c.class_name LIKE '计算机%';

结果只包含“计算机1班”和“计算机X班”,其他班级不出现。

如果将条件放在 WHERE 中,则会先连接所有班级,再过滤掉不符合条件的班级,导致那些班级被删除,不符合“保留所有此类班级”的意图。

五、与其他连接的关系

  • 内连接:只返回匹配的行。

  • 左连接:返回左表全部,右表匹配则填充,否则 NULL。

  • 右连接:返回右表全部,左表匹配则填充,否则 NULL。

  • 全外连接:返回两个表的全部行,不匹配的一侧补 NULL。MySQL 不支持 FULL OUTER JOIN,但可以通过 LEFT JOIN UNION RIGHT JOIN 模拟。

六、右连接的应用场景

虽然右连接不常用,但在某些特定场景下可能更自然:

  1. 当我们需要以右表为主表进行查询时,且右表作为主要实体(例如,报表中以“部门”为主,列出所有部门及其员工)。

  2. 在已经存在的查询基础上,希望快速将主表切换到右表,而不需要重写整个 FROM 子句。

即便如此,更推荐的做法是调整查询,使用左连接来保持可读性。

七、练习与思考

  1. 基于 orders(订单表)和 customers(客户表),使用右连接查询所有客户及其订单信息,即使某些客户尚未下单。

  2. 将上述查询改写为左连接形式。

答案

-- 右连接形式
SELECT o.order_id, o.order_date, c.customer_name
FROM orders o
RIGHT JOIN customers c ON o.customer_id = c.customer_id;

-- 左连接形式(交换表顺序)
SELECT o.order_id, o.order_date, c.customer_name
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id;

八、小结

特性

说明

作用

返回右表中的所有记录,左表匹配则填充数据,不匹配则补 NULL

语法

左表 RIGHT JOIN 右表 ON 条件

结果特点

右表记录全部保留,左表仅保留匹配行

与左连接的关系

可通过交换表顺序相互转换,实际开发中常用左连接

注意事项

ON 和 WHERE 的作用时机与左连接相同

适用场景

较少,通常可以用左连接替代

右连接作为 SQL 连接家族的一员,理解它有助于你更全面地掌握连接查询,并在必要时读懂他人代码。但作为实践者,保持风格统一、优先使用左连接是更稳健的选择。


所有评论

关于我 备案号:蜀ICP备2023042032号-1