面试官问:JOIN类型与ON/WHERE条件区别?一张图+相亲匹配比喻,彻底拿下这道必考题(附图解+比喻+避坑指南)

发布时间:2026/7/20 20:56:43

面试官问:JOIN类型与ON/WHERE条件区别?一张图+相亲匹配比喻,彻底拿下这道必考题(附图解+比喻+避坑指南) 面试官问JOIN类型与ON/WHERE条件区别一张图相亲匹配比喻彻底拿下这道必考题附图解比喻避坑指南预计阅读13分钟 你是不是也这样能写出LEFT JOIN但面试官一追问“ON和WHERE有什么区别”“为什么LEFT JOIN时把条件放WHERE结果就不一样了”就答不上来了今天一张图 一个相亲匹配故事 四种JOIN详解 六道追问彻底拿下这道题。摘要SQL JOIN用于连接多表查询主要分为INNER JOIN内连接、LEFT/RIGHT JOIN外连接、FULL JOIN全外连接和CROSS JOIN交叉连接。ON和WHERE的核心区别在于执行时机ON在连接阶段生效决定表如何匹配WHERE在连接完成后生效对最终结果集进行过滤。INNER JOIN中ON和WHERE逻辑等价LEFT JOIN中ON不影响左表行数WHERE会过滤掉左表无匹配的行。一句话ON管“怎么连”WHERE管“怎么筛”。我是折哥《Java 85题图解版》系列连载中已更新30题建议收藏本系列。每周2-3篇85题通关路线一键追完。点击关注第一时间收到每篇新题推送。上一篇面试官问索引底层B树结构是怎样的下一篇预告面试官问慢SQL如何定位与优化全部85题点击查看总目录关注专栏追更不迷路一句话总结ON管“怎么连”WHERE管“怎么筛”。INNER JOIN只返回两表都能匹配上的行 → 像相亲双方都互相选中才配对成功。LEFT JOIN返回左表所有行右表匹配不上填NULL → 像男生全部保留无论女生是否选中他。RIGHT JOIN返回右表所有行左表匹配不上填NULL → 像女生全部保留无论男生是否选中她。FULL JOIN返回两表所有行不匹配填NULL → 像所有人都保留单方面喜欢的也保留。背诵口诀内连接ONWHERE左连接ON保左表ON在连前起作用WHERE连后筛全部。核心设计理念ON定义连接规则如何匹配WHERE过滤最终结果要哪些行。 面试还原面试官SQL中JOIN有哪几种ON和WHERE有什么区别什么情况下结果会不同这是数据库面试中必问必考的核心题直接进入正题。 一图看懂JOIN类型与ON/WHERE全貌 生活比喻相亲匹配系统场景设定你开发了一个相亲匹配系统有两个数据表男嘉宾表左表和女嘉宾表右表。INNER JOIN “必须双向选择”系统只匹配双方都互相选中的男女。男生选了女生女生也选了男生才配对成功。单方面喜欢的不算。LEFT JOIN “男生保留所有选择”系统保留所有男生的记录无论女生是否选中他。男生选了谁系统就列出谁如果女生没选他女生信息填NULL。RIGHT JOIN “女生保留所有选择”系统保留所有女生的记录无论男生是否选中她。女生选了谁系统就列出谁如果男生没选她男生信息填NULL。FULL JOIN “所有人都保留”系统保留所有男生和所有女生的记录无论对方是否选中自己。单方面喜欢的也保留对方信息填NULL。ON “匹配规则”ON定义的是“什么样算匹配”——比如“男生选的女生ID 女生ID”。它决定哪些行被连接在一起。WHERE “最终筛选”WHERE是在所有匹配完成后对结果集做最终筛选——“只要25岁以上的”“只要北京的”。一句话对照ON 匹配规则怎么连WHERE 最终筛选要哪些。 JOIN类型详解面试速查版四种核心JOIN对比JOIN类型返回结果典型场景INNER JOIN两表都能匹配上的行订单订单明细LEFT JOIN左表全部 右表匹配的用户订单含未下单用户RIGHT JOIN右表全部 左表匹配的极少使用可用LEFT JOIN互换FULL JOIN两表全部不匹配填NULL合并两个系统的数据RIGHT JOIN很少用因为把表顺序互换就能变成LEFT JOIN。 ON vs WHERE深度解析面试最高频执行顺序SQL的执行顺序是FROM → ON → JOIN → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT。ON在连接阶段执行WHERE在连接完成后执行。这是两者差异的根本原因。INNER JOINON和WHERE等价在INNER JOIN中ON和WHERE的过滤效果逻辑等价。-- 以下两种写法结果完全相同-- 写法1条件在ON中SELECT*FROMAINNERJOINBONA.idB.a_idANDB.statusactive;-- 写法2条件在WHERE中SELECT*FROMAINNERJOINBONA.idB.a_idWHEREB.statusactive;两种写法结果一致。但数据库优化器可能将ON中的条件下推到表扫描阶段减少连接输入数据量因此INNER JOIN中推荐将过滤条件放在ON子句。LEFT JOINON和WHERE完全不同LEFT JOIN的核心是保留左表所有行。ON和WHERE的位置直接影响结果ON中过滤右表仅影响右表的匹配逻辑左表行数不变。未匹配的右表列返回NULL。-- ON中过滤保留所有左表行只连接右表中statusactive的记录SELECT*FROMALEFTJOINBONA.idB.a_idANDB.statusactive;-- 结果A表所有行都保留B表不匹配的填NULLWHERE中过滤右表WHERE对最终结果生效NULL不满足条件会间接过滤左表行。-- WHERE中过滤会排除左表中无匹配的行SELECT*FROMALEFTJOINBONA.idB.a_idWHEREB.statusactive;-- 结果B表无匹配的行B.status为NULL被整行过滤掉关键结论若需保留左表所有行对右表的过滤必须放在ON若需过滤最终结果包括排除左表无匹配的行则使用WHERE。 ON vs WHERE 速查表场景ON中的条件WHERE中的条件INNER JOIN✅ 结果等价✅ 结果等价LEFT JOIN左表条件⚠️ 不影响左表行数❌ 会过滤左表无匹配行LEFT JOIN右表条件✅ 右表过滤左表全保留❌ 会过滤掉左表无匹配的行执行阶段连接阶段连接完成后 实战案例案例1INNER JOINON和WHERE等价-- 两表结果完全相同SELECT*FROMstudent sINNERJOINclass cONs.classIdc.idANDs.name张三;SELECT*FROMstudent sINNERJOINclass cONs.classIdc.idWHEREs.name张三;案例2LEFT JOINON和WHERE天壤之别-- ❌ 错误WHERE会过滤掉左表无匹配的行SELECT*FROMtab1LEFTJOINtab2ONtab1.sizetab2.sizeWHEREtab2.nameAAA;-- 过程①ON先匹配 ②WHERE再过滤左表无匹配的行被整行删除-- ✅ 正确ON保留左表所有行SELECT*FROMtab1LEFTJOINtab2ONtab1.sizetab2.sizeANDtab2.nameAAA;-- 过程ON中条件匹配左表所有行保留右表不匹配的填NULL案例3ON中的左表条件-- 左表条件在ON中不影响左表行数SELECT*FROMstudent sLEFTJOINclass cONs.classIdc.idANDs.name张三;-- 结果所有学生都保留name不是张三的右表填NULL-- 左表条件在WHERE中会过滤左表SELECT*FROMstudent sLEFTJOINclass cONs.classIdc.idWHEREs.name张三;-- 结果只返回name是张三的学生 高频面试追问6道大厂真题追问1ON和WHERE哪个先执行为什么回答要点ON先执行连接阶段WHERE后执行连接完成后。详细回答ON在连接阶段执行决定表如何匹配WHERE在连接完成后执行对临时结果集进行过滤。这是因为数据库需要先知道“哪些行应该连接在一起”才能对连接后的结果做筛选。追问2INNER JOIN中条件放在ON和WHERE有区别吗回答要点结果没区别但性能可能有差异。详细回答逻辑上完全等价结果相同。但优化器可能将ON中的条件下推到表扫描阶段减少连接时的输入数据量从而提升性能。因此INNER JOIN中推荐将过滤条件放在ON子句。追问3LEFT JOIN中为什么ON条件不影响左表行数回答要点LEFT JOIN的定义就是保留左表所有行。详细回答LEFT JOIN的核心语义是保留左表全部行。ON条件只决定“右表如何匹配左表”不决定“左表是否出现”。即使ON条件全为假左表每一行也都会出现在结果集中右表字段填NULL。追问4为什么RIGHT JOIN很少用回答要点RIGHT JOIN可以互换表顺序变成LEFT JOIN。详细回答A RIGHT JOIN B等价于B LEFT JOIN A。把所有查询统一成LEFT JOIN代码更一致、更容易理解。实际开发中极少见到RIGHT JOIN。追问5FULL JOIN和UNION有什么区别回答要点FULL JOIN合并两表行UNION合并两个查询结果。详细回答FULL JOIN一次连接操作返回两表所有行按连接条件匹配不匹配填NULLUNION合并两个独立查询的结果集上下拼接要求列数相同FULL JOIN可用LEFT JOIN UNION RIGHT JOIN模拟因为MySQL不原生支持FULL JOIN。追问6ON和WHERE哪个性能更好回答要点INNER JOIN中ON可能更优LEFT JOIN中取决于需求。详细回答INNER JOINON中的条件可能被优化器下推减少连接输入数据量理论上ON更优LEFT JOIN不是性能问题是结果正确性问题。先用ON还是WHERE取决于你想要什么结果 避坑指南序号错误做法正确做法后果1LEFT JOIN中把右表过滤条件放WHERE放ON中保留左表全部行左表无匹配的行被整行删除2LEFT JOIN中把左表过滤条件放ON放WHERE中真正过滤左表左表行数不受影响过滤无效3认为ON和WHERE在所有场景等价区分INNER和OUTER JOINOUTER JOIN结果完全不同4滥用RIGHT JOIN用LEFT JOIN互换表顺序代码可读性差5忘记OUTER JOIN中ON不控制主表行数记住LEFT JOIN一定会返回左表全部行结果集行数超出预期 可运行验证代码-- 准备测试数据CREATETABLEstudent(idINT,nameVARCHAR(20),classIdINT);CREATETABLEclass(idINT,nameVARCHAR(20));INSERTINTOstudentVALUES(1,张三,1),(2,李四,2),(3,王五,NULL);INSERTINTOclassVALUES(1,一班),(2,二班);-- 1. INNER JOINON和WHERE等价SELECT*FROMstudent sINNERJOINclass cONs.classIdc.idANDs.name张三;SELECT*FROMstudent sINNERJOINclass cONs.classIdc.idWHEREs.name张三;-- 两结果完全相同-- 2. LEFT JOINON不影响左表行数SELECT*FROMstudent sLEFTJOINclass cONs.classIdc.idANDs.name张三;-- 所有学生都出现name不是张三的右表字段为NULL-- 3. LEFT JOINWHERE会过滤左表SELECT*FROMstudent sLEFTJOINclass cONs.classIdc.idWHEREs.name张三;-- 只有张三出现其他学生被过滤掉-- 4. LEFT JOIN右表条件在ON vs WHERESELECT*FROMstudent sLEFTJOINclass cONs.classIdc.idANDc.name一班;-- 所有学生出现只有匹配一班的右表有值SELECT*FROMstudent sLEFTJOINclass cONs.classIdc.idWHEREc.name一班;-- 只有能匹配一班的学生出现无匹配的被过滤❓ 评论区挑战问题以下关于ON和WHERE的说法哪一个是错误的-- 场景查询所有学生及其班级信息SELECT*FROMstudent sLEFTJOINclass cONs.classIdc.idANDc.name一班;A. LEFT JOIN中ON条件不影响左表student的行数B. 如果右表class无匹配右表字段返回NULLC. 这个查询只返回一班的学生其他学生被过滤掉了D. 如果把c.name 一班移到WHERE中结果会不同 欢迎在评论区写出你的答案和理由我会在下一篇文章发布后更新本文公布答案及错误选项逐项解析。✅ 答案公布正确答案C. 这个查询只返回一班的学生其他学生被过滤掉了解析LEFT JOIN中ON条件不影响左表行数左表student所有行都会保留查询会返回所有学生只有能匹配一班的学生右表class有值不能匹配的右表字段为NULL选项A正确ON不影响左表行数选项B正确无匹配时右表返回NULL选项D正确移到WHERE中会过滤掉无匹配的行错误选项逐项解析AON不影响左表行数正确。LEFT JOIN的核心特性就是保留左表所有行。B无匹配时右表返回NULL正确。这是OUTER JOIN的标准行为。D移到WHERE结果不同正确。WHERE在连接完成后过滤会排除无匹配的行。C只返回一班的学生错误。ON条件不影响左表所有学生都保留不匹配的右表填NULL。 总结JOIN类型返回结果ON vs WHEREINNER JOIN两表匹配的行ON和WHERE等价LEFT JOIN左表全部 右表匹配ON不影响左表WHERE会过滤左表RIGHT JOIN右表全部 左表匹配同LEFT方向相反FULL JOIN两表全部同LEFT/RIGHTCROSS JOIN笛卡尔积无条件无需ON面试官最看重的三个点JOIN类型定义INNER、LEFT、RIGHT、FULL——能说清各自返回什么ON vs WHERE执行顺序ON先执行连接阶段WHERE后执行连接完成后LEFT JOIN中ON和WHERE的差异ON不影响左表行数WHERE会过滤左表——能讲清楚为什么 系列导航上一篇面试官问索引底层B树结构是怎样的下一篇预告面试官问慢SQL如何定位与优化全部85题目录点击查看关注专栏每周2-3篇一键追更搭配学习效果更佳本篇图解帮你快速建立知识画面记忆如果想深入理解源码实现和实战避坑细节可以配合姊妹系列《Java 100天进阶之路》对应章节一起学从零基础到上岗就业108篇完整学习地图每篇标配生活类比 可运行代码 避坑表 面试高频题 练习题不背八股文真正讲透“为什么”。 《Java 100天进阶之路》完整目录导航学习建议图解系列负责“快速建立知识图谱”进阶系列负责“深入理解原理”两个系列搭配使用面试备考效率翻倍。你在实际项目中遇到过因为ON/WHERE位置放错导致的SQL结果异常吗或者被ON和WHERE的区别坑过欢迎评论区分享你的故事

相关新闻