left join保左表全量、right join保右表全量,二者逻辑对称;left join用于保留左表所有行(右表不匹配填null),right join同理但方向相反;实践中优先用left join并调换表序以提升可读性。

LEFT JOIN 和 RIGHT JOIN 的核心区别,只在于「哪张表的数据必须全部保留」——LEFT JOIN 保左表全量,RIGHT JOIN 保右表全量;其余逻辑完全对称。
LEFT JOIN 保留左表所有行,右表不匹配则填 NULL
当你明确需要「左表数据不能丢」时用它。比如查所有员工及其部门信息,但有些员工 dept_id 为空或部门已删除,你仍要列出这些员工(部门字段为 NULL)。
-
ON条件只决定右表哪些行能连上,不影响左表行数 - 如果在
WHERE子句里对右表字段加非空限制(如WHERE dept.name IS NOT NULL),会把原本该保留的左表空匹配行过滤掉——这实际退化成INNER JOIN - MySQL、PostgreSQL、SQL Server 都支持,语法行为一致
RIGHT JOIN 保留右表所有行,左表不匹配则填 NULL
它和 LEFT JOIN 在语义上完全互逆,只是主表换了个方向。例如:查所有部门及下属员工,哪怕某个部门当前没员工,也要显示出来(员工字段为 NULL)。
- 写
SELECT * FROM A RIGHT JOIN B ON A.id = B.a_id等价于把表顺序调换:SELECT * FROM B LEFT JOIN A ON B.a_id = A.id - 绝大多数团队约定禁用
RIGHT JOIN,因为可读性差——人脑习惯从左到右读,看到右表先出现反而要倒推主表 - 某些 ORM(如 Django ORM)甚至不生成
RIGHT JOIN,只提供LEFT JOIN接口
ON 和 WHERE 对 LEFT/RIGHT JOIN 的影响完全不同
ON 是连接逻辑的一部分,WHERE 是连接完成后的结果过滤——这点在外连接中尤其关键。
-
LEFT JOIN ... ON A.x = B.y WHERE B.z > 10:先连出所有左表行 + 匹配的右表行,再把右表z 或为 <code>NULL的整行删掉 - 想保留左表所有行,同时只取右表满足条件的记录?得把条件挪进
ON:LEFT JOIN ... ON A.x = B.y AND B.z > 10 -
RIGHT JOIN同理,但容易因表序混乱导致条件写错,这也是它被冷落的主因
真正容易被忽略的是:LEFT JOIN 和 RIGHT JOIN 的执行计划在多数数据库里并无性能差异,瓶颈永远在连接字段是否有索引、数据倾斜程度,而不是“左”或“右”的语法选择。但团队协作中,统一用 LEFT JOIN + 调换表序,能减少理解成本和出错概率。











