left join on 后面 and 用法
今天查数据,使用 left join , 想着提前过滤下数据性能会好, on 后面多加了几个 and 条件, 发现数据并不是预想的结果,遂搜索一番,发现之前对 on 后面的条件一直有一个大的误区。
MYSQL 版本: 5.7.22
T1 表 T2 表
SQL 1:
select * from T1 t1 left join T2 t2 on t1.id = t2.id and t2.EnName = 'Mark';
结果为:
SQL 2:
select * from T1 t1 left join T2 t2 on t1.id = t2.id and t1.name = '张三';
结果为:
结论: 当使用 left join(或 right join) 的时候, 主表的数据并不会因为 on 后面的过滤条件而有所改变, on 后面的过滤条件只会影响 关联从表的数据。
如果想对表结果数据产生影响, 使用 inner join 或者 在最后使用 where 进行过滤。
- inner join :
-- sql1 select * from T1 t1 inner join T2 t2 on t1.id = t2.id and t1.name = '张三'; -- sql2 select * from T1 t1 inner join T2 t2 on t1.id = t2.id and t2.EnName = 'Mark';
sql1 : sql2:
- where
select * from T1 t1 left join T2 t2 on t1.id = t2.id where t1.name = '张三';
left join(right join) 是在 on 过滤后 join , 然后进行追加, 相对来说 on 提前过滤数据, 减少了笛卡尔积 的数据量,但是之前不知道 过滤后还要进行追加,后面使用时 需注意这点。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)