inner join只返回两表连接字段完全相等的行,不保留左表无匹配行;left join保留左表所有行,右表无匹配则补null。

INNER JOIN 和 LEFT JOIN 最核心的区别在于:是否保留左表中“找不到匹配”的那些行。
INNER JOIN 只要交集,不匹配的全丢掉
它像一个严格的筛选器,只返回两个表中连接字段完全相等的行。只要某一行在另一张表里找不到对应数据,这一整行就彻底不会出现在结果里。
- 结果行数 ≤ 左表行数,也 ≤ 右表行数
- 结果中绝不会出现 NULL(来自右表字段)
- 常用于“必须有关联才看”的场景,比如查“已付款的订单 + 对应用户信息”
LEFT JOIN 以左表为本,右表能配就配,配不上就填 NULL
它先确保左表每一行都出现在结果中,再尽可能从右表找匹配项。没找到?右表对应字段就用 NULL 补位。
- 结果行数一定等于左表行数
- 右表字段可能出现大量 NULL
- 适合“主表数据不能少”的需求,比如查“所有用户 + 他们的订单”,哪怕有人没下单也要列出来
一个关键陷阱:WHERE 和 ON 的位置很关键
对 RIGHT 表字段加条件时,写在 ON 里和写在 WHERE 里效果完全不同:
- ON u.id = o.user_id AND o.status = 'paid':只尝试把已支付的订单连上去,没订单或未支付的用户仍保留(右表字段为 NULL)
- LEFT JOIN ... ON u.id = o.user_id WHERE o.status = 'paid':先连完再过滤,NULL 值被 WHERE 排除,结果变成只显示有已支付订单的用户——实际等效于 INNER JOIN
RIGHT JOIN 基本可以不用记
它的行为是 LEFT JOIN 的镜像:以右表为基准,左表无匹配则补 NULL。但实践中几乎都通过调换表顺序 + 改用 LEFT JOIN 来实现,更直观也更通用。










