当前位置: 首页 > news >正文

LEFT JOIN 中 ON 与 WHERE 过滤的差异

在 MySQL 数据库开发中LEFT JOIN左外连接是一个最常被误用的语法。许多开发者往往习惯性地将所有过滤条件一股脑地往ON后面塞或者为了排版好看将条件全部扔到WREHRE里面。这种模糊的逻辑在普通内连接INNER JOIN中确实没有区别但在LEFT JOIN中多条件写在 ON 还是 WHERE会导致完全不同的执行结果与查询性能。1. 核心结论一句话总结写在ON里面代表连接条件。不论右表是否满足此条件左驱动表的数据绝对不会丢。若右表不满足右表字段直接补NULL。写在WHERE里面代表过滤条件。它是对关联后的整个结果集进行大筛查。一旦右表字段因不满足而被补了NULL它就会在WHERE过滤中被彻底抹去。2. 真实案例单步拆解为了还原现场我们准备两张最简单的基础表表 a商品表f1 (商品ID)name (商品名)1苹果2香蕉表 b价格表f1 (商品ID)f2 (促销价格)130250场景一多条件写在ON之中促销条件关联SELECT*FROMaLEFTJOINbON(a.f1b.f1ANDb.f230);MySQL 底层单步执行逻辑由于是LEFT JOIN表a被指定为驱动表。执行器会拿着表a的数据一行行去匹配表b匹配的硬性考核指标是a.f1 b.f1并且b.f2 30。**处理“苹果”行(1, 苹果)**拿着f11去表b找找到了满足b.f11的行紧接着评估第二个条件b.f230。此时3030匹配成功。本步结果→\rightarrow→(1, 苹果, 1, 30)。**处理“香蕉”行(2, 香蕉)**拿着f12去表b找找到了b.f12的行但它的b.f2是 50不满足b.f230的要求。关键机制因为是LEFT JOIN左表数据不能丢。既然表b没有行能同时满足这两个条件那就强行输出“香蕉”右表全部填NULL。本步结果→\rightarrow→(2, 香蕉, NULL, NULL)。最终场景一输出结果a.f1a.nameb.f1b.f21苹果1302香蕉NULLNULL语义总结“我只想和表 b 中价格是 30 的促销项连。如果它不是 30我就不跟它连但我自己表 a依然要保留右边展示为 NULL 即可。”场景二条件挪到WHERE之中连接后过滤SELECT*FROMaLEFTJOINbON(a.f1b.f1)WHEREb.f230;MySQL 底层单步执行逻辑第一阶段连接首先只看ON (a.f1 b.f1)此时“苹果”和“香蕉”都能正常连上表b。生成一个中间临时结果集记录一(1, 苹果, 1, 30)记录二(2, 香蕉, 2, 50)第二阶段大过滤连接完全结束后WHERE b.f2 30开始收网。执行器检查上面两条记录发现记录二的b.f2是 50不符合WHERE条件当场予以剔除消失。最终场景二输出结果a.f1a.nameb.f1b.f21苹果130⚠️ 惊人的幕后优化驱动表被调换了在场景二中既然WHERE条件强制限定了b.f2 30这意味着表b中所有不匹配或者补NULL的行统统都是无效的。MySQL 优化器敏锐地发现了这一点会在后台默默将这个LEFT JOIN直接改写为内连接INNER JOIN。改写后由于表b带有b.f2 30的强过滤条件数据集更小右表b反而会反客为主变成真正的驱动表。3. 避坑指南如何防范为了避免線上环境列表无故少数据或者多出了全是NULL的垃圾数据我们在写外连接时需要遵守以下原则明确逻辑目的如果你要找的是“不满足某些条件的残缺对照”例如查出所有没有参加 30 元促销的商品必须把条件写在ON里并配合右表主键IS NULL过滤。如果你仅仅是想对右表进行结果筛选请直接写JOIN不要写LEFT JOIN。利用EXPLAIN脑补流程如果你写了LEFT JOIN却在Extra字段里看到了Using where且第一行的表驱动表变成了右表说明你的WHERE条件已经打破了LEFT JOIN的语义被优化器降级改写了。在处理多表关联的业务如复杂报表、用户主页信息流时多花半分钟确认过滤条件在ON还是WHERE能为你省下大量的线上 Debug 时间。
http://www.zskr.cn/news/1343621.html

相关文章:

  • C语言指针深度剖析:从内存地址到传址调用
  • 阿盖洛印相×真实银盐底片对比实测:27组DxO基准图像分析证明——MJ v6.2已逼近1930年代Kodak Azo纸动态范围(附测试集下载)
  • 今日实测有效的淘宝闪购外卖/京东外卖/美团外卖红包天天领取口令怎么领今天可用的外卖红包神券?
  • 2026最新诚信优选 安庆市迎江区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • 随钻连斜传感器操作手册:定向探管安装调试、故障排查与保养要点
  • 如何让Mac永不休眠:自动鼠标移动器的终极指南
  • 油雾净化设备哪家技术更专业
  • 今天实测有效!2026淘宝京东天猫618红包领取口令最新推荐怎么天天领618淘宝京东天猫红包?
  • 《从 0 实现 SGLang》第 1 篇 · LLM 推理引擎到底在做什么
  • 2026年必看:六款热门AI编程工具横评,Trae与Cursor怎么选
  • 如何用3D打印打造1000美元内的开源六轴机械臂:完整DIY指南
  • 终极Sollumz完整指南:从零开始掌握GTA V模型编辑
  • 轻量化无广告!开箱即用 M3U8 在线播放器,调试预览一步到位
  • 终极视频修复指南:使用UNTRUNC拯救你的损坏视频文件
  • # 如何从控制台获取
  • 深圳GEO服务商能不能保证关键词上AI推荐首页?
  • 初次体验 Taotoken 从注册到完成第一个 Python API 调用的全过程
  • MatMul 算子在昇腾 NPU 上的优化实践:从原理到实战
  • windows VS2026 编译32位 onnxRuntime
  • MySql存储引擎与索引
  • 从低空协议劫持实战看 MAVLink 二进制审计在飞控发布环节的必要性
  • HYPE分布式水文模型建模方法与案例分析实践技术应用:精准完成子流域划分;系统解锁土地利用、土壤数据提取技巧
  • Light: Science Applications | 从平坦能带到量子行走:非阿贝尔Thouless泵浦的新篇章
  • 2026最新诚信优选 重庆市万州区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • 【JUC】线程池
  • 2026年信创考勤系统推荐与选型对比:政策要求及5款主流产品全解析
  • 深圳电商财税公司推荐top8,商家选型参考!
  • BeeWorks 的 “链端管“ 安全体系到底有多强?
  • 2026最新诚信优选 重庆市綦江区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • 2026最新诚信优选 吕梁市离石区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收