You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LEFT JOIN多条件关联与WHERE条件的差异及优劣对比

SQL LEFT JOIN 条件位置差异问题解析

示例SQL代码

示例1:条件写在JOIN ON子句中

FROM
    table1
    LEFT JOIN table2 ON
        table1.id = table2.id
        AND
        table2.flag = TRUE

示例2:条件写在WHERE子句中

FROM
    table1
    LEFT JOIN table2 ON
        table1.id = table2.id
WHERE
    table2.flag = TRUE

Q1:两段查询返回的行数是否一致?若不一致,原因是什么?

行数肯定不一致,核心原因是左连接的匹配逻辑,加上条件放置的位置优先级不同:

  • 示例1里,table2.flag = TRUE是跟在JOIN的ON后面,相当于先把table2里flag为TRUE的行挑出来,再和table1做左连接。不管table1里的行能不能匹配到符合条件的table2数据,table1的所有行都会保留,匹配不到的话table2的字段就显示NULL。
  • 示例2里,table2.flag = TRUE是放在WHERE里,相当于先把table1和table2全量左连接(table1所有行都留着,匹配不到的table2字段是NULL),之后再过滤结果。这时候table2.flag = TRUE会把那些table2字段为NULL的行直接删掉,最后结果其实和用INNER JOIN是一样的,只留table1和table2 id匹配、且table2 flag为TRUE的行。

Q2:哪种写法更适合实际业务场景?

得看你实际业务需求来选:

  • 如果要保住table1的所有数据,同时只关联table2里flag为TRUE的内容(没匹配到的就显示NULL),就用示例1的写法。比如统计所有用户的已完成订单情况,哪怕某个用户没有已完成订单,也要把这个用户的信息留在结果里。
  • 如果只需要同时在table1和table2里存在、且table2 flag为TRUE的数据,就用示例2的写法(其实这时候直接写成INNER JOIN会更明白,别人看代码一眼就懂逻辑)。比如筛选出有已完成订单的用户,以及他们对应的订单信息。

内容的提问来源于stack exchange,提问作者Katsu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 16:07:27