mysql菜鸟教程
11.4 右连接(RIGHT JOIN)
右连接是左连接的“镜像”,它返回右表中的所有记录,以及左表中满足连接条件的记录。如果左表中没有匹配,则左表对应的列填充为 NULL。虽然右连接在功能上与左连接对称,但在实际开发中,左连接的使用频率远高于右连接,因为我们可以通过交换表的顺序用左连接实现相同的效果。不过,了解右连接有助于全面理解 SQL 连接。
一、基本语法
SELECT 列名 FROM 左表 RIGHT [OUTER] JOIN 右表 ON 连接条件;
其中 OUTER 可以省略,通常直接写 RIGHT JOIN。
二、基础示例:所有班级及其学生
沿用之前的 students 和 classes 表:
students(左表)
classes(右表)
现在,我们想列出所有班级及其学生,即使某些班级目前还没有学生。使用右连接:
SELECT s.name, c.class_name FROM students s RIGHT JOIN classes c ON s.class_id = c.class_id;
结果:
结果解读:
班级 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 模拟。
六、右连接的应用场景
虽然右连接不常用,但在某些特定场景下可能更自然:
当我们需要以右表为主表进行查询时,且右表作为主要实体(例如,报表中以“部门”为主,列出所有部门及其员工)。
在已经存在的查询基础上,希望快速将主表切换到右表,而不需要重写整个 FROM 子句。
即便如此,更推荐的做法是调整查询,使用左连接来保持可读性。
七、练习与思考
基于 orders(订单表)和 customers(客户表),使用右连接查询所有客户及其订单信息,即使某些客户尚未下单。
将上述查询改写为左连接形式。
答案:
-- 右连接形式 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;
八、小结
右连接作为 SQL 连接家族的一员,理解它有助于你更全面地掌握连接查询,并在必要时读懂他人代码。但作为实践者,保持风格统一、优先使用左连接是更稳健的选择。

发表评论
所有评论