RIGHT JOIN 返回右表所有记录及左表匹配记录,不匹配时左表字段为NULL;等价于RIGHT OUTER JOIN,执行时遍历右表并查找左表匹配行,常用于保留右表全部数据的场景。

MySQL 中的 RIGHT JOIN 用于返回右表(即 JOIN 右侧的表)中的所有记录,以及左表中与之匹配的记录;如果左表没有匹配项,则对应字段为 NULL。
RIGHT JOIN 的基本语法和逻辑
RIGHT JOIN 等价于 RIGHT OUTER JOIN,关键词 OUTER 可省略。其执行顺序是:先遍历右表的每一行,再尝试在左表中查找满足 ON 条件的匹配行。
- 右表所有行都会出现在结果集中
- 左表只有满足连接条件的行才被关联进来;不匹配时,左表字段显示为 NULL
- 若想保留右表全部数据但又不确定左表是否有对应数据,RIGHT JOIN 是合适选择
RIGHT JOIN 和 LEFT JOIN 的本质区别
RIGHT JOIN 和 LEFT JOIN 在功能上完全可互换,只是书写视角不同。例如:
SELECT * FROM A RIGHT JOIN B ON A.id = B.a_id;
等价于
SELECT * FROM B LEFT JOIN A ON A.id = B.a_id;
实际开发中,多数人习惯用 LEFT JOIN 表达“以某表为主”,所以 RIGHT JOIN 使用频率较低,但理解它有助于读懂他人代码或处理特定建模场景。
使用 RIGHT JOIN 的典型场景示例
假设有一张 orders 表(订单)和一张 customers 表(客户),部分订单可能暂无客户信息(如游客下单):
SELECT c.name, o.order_no FROM customers c RIGHT JOIN orders o ON c.id = o.customer_id;
该语句会列出所有订单,并附带对应的客户姓名;若某订单 customer_id 为空或找不到客户,c.name 就是 NULL,但该订单仍会显示。
注意事项与常见误区
RIGHT JOIN 容易因表顺序写反导致结果不符合预期,尤其在多表连接中。建议注意以下几点:
- ON 条件必须明确指定两表关联字段,不能遗漏或写错方向(如误写成 o.id = c.id)
- WHERE 子句中对左表字段加条件(如 WHERE c.status = 'active')会把原本应为 NULL 的行过滤掉,从而“退化”为 INNER JOIN 效果
- 若需保留右表全部数据且还要过滤右表本身,应将条件写在 ON 后或用子查询预处理










