带where过滤时inner join与left join结果相同,应该选择哪种join?
两类写法结果一致的原因
你写的LEFT JOIN语句实际已经被WHERE条件改成了等价INNER JOIN的效果:
LEFT JOIN执行时,没有匹配到订单的客户(1002 Boi、1004 Dore)对应的t2.color字段会是NULL,而WHERE t2.color='pink'会把所有t2.color为NULL的行全部过滤掉,最终只会保留同时匹配了客户表、且有粉色订单的记录,和INNER JOIN的执行结果完全一致。
JOIN选型判断逻辑
判断用哪种JOIN的核心依据是你的业务需求,没有通用的最优解,只看和需求的匹配度:
- 如果你要的是仅购买过粉色商品的客户(必须同时存在客户信息、对应的粉色订单记录),优先选
INNER JOIN:- 可读性更强:看代码的人不需要额外排查WHERE条件,第一眼就能明确你要的是两张表匹配成功的记录
- 执行效率更高:数据库优化器不需要先保留左表全量数据再做过滤,能生成更优的执行计划,数据量越大优势越明显
- 如果你要的是全量客户的粉色商品购买情况(没有买过粉色的客户也要保留,购买信息位留空),就用
LEFT JOIN,但要注意把右表的过滤条件放到ON子句里,而不是WHERE里,正确写法示例:
select t1.cid,t1.name,t2.color from Customers t1 left join Orders t2 on t1.cid=t2.cid and t2.color='pink'
这个写法会返回全部4位客户,没有买过粉色的Boi、Dore对应的color字段会显示为NULL。
内容的提问来源于stack exchange,提问作者rtys
相关产品推荐
相关产品推荐

