news 2026/5/23 20:05:47

HoRain云--SQL连接条件:ON与WHERE的区别详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HoRain云--SQL连接条件:ON与WHERE的区别详解

🎬 HoRain 云小助手:个人主页

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

目录

⛳️ 推荐

💡 关键在于 LEFT JOIN的特性

🧪 通过实例理解

✅ 实用建议与选择


理解JOIN ... ON中多个条件与WHERE子句的区别,对于编写正确和高效的 SQL 查询至关重要。核心差异在于ON子句决定表之间如何连接,而WHERE子句决定最终结果集中包含哪些行

下面这个表格直观地展示了两者的主要区别。

特性

ON子句中的条件 (在LEFT JOIN中)

WHERE子句中的条件

执行时机

连接过程中应用

连接完成后,对中间结果进行过滤

主要作用

确定右表中哪些行与左表匹配

过滤最终结果集,所有不满足条件的行都会被排除

对左表行数的影响

不影响左表行数,即使右表无匹配,左表行仍会保留(右表字段以NULL填充)

会影响最终返回的行数,不满足条件的行(包括左表行)会被过滤掉

对结果的影响

影响右表匹配内容,不匹配则右表字段为NULL

决定最终哪些行可以出现在结果集中

💡 关键在于LEFT JOIN的特性

上述区别在LEFT JOIN(左连接)中表现得最为明显。LEFT JOIN的核心承诺是:无论如何都会返回左表的所有行

🧪 通过实例理解

我们通过一个具体例子来加深理解。假设有两个表:

场景一:筛选条件在ON子句中

SELECT * FROM product LEFT JOIN product_details ON (product.id = product_details.id AND product_details.id = 2);

结果:会返回4行数据。左表product的所有记录都被返回,但只有id=2的产品在product_details中有匹配的详细信息,其他产品的详情字段均为NULL

product.id

amount

product_details.id

weight

exist

1

100

NULL

NULL

NULL

2

200

2

22

0

3

300

NULL

NULL

NULL

4

400

NULL

NULL

NULL

场景二:筛选条件在WHERE子句中

SELECT * FROM product LEFT JOIN product_details ON (product.id = product_details.id) WHERE product_details.id = 2;

结果:只返回1行数据。这条查询先进行左连接,产生一个包含4行记录的中间表,然后WHERE条件product_details.id = 2会过滤掉所有右表id不是2或为NULL的行,最终只保留id=2的产品记录。

product.id

amount

product_details.id

weight

exist

2

200

2

22

0

✅ 实用建议与选择

了解区别后,如何做出正确选择呢?

  1. 当你需要保留左表的所有记录时

    使用LEFT JOIN ... ON,并将对右表的过滤条件放在ON子句中。这在需要统计左表主数据的存在情况时非常有用,例如“查询所有产品及其审核状态(即使某些产品尚未被审核)”。

  2. 当你需要过滤最终结果集时

    使用WHERE子句。例如,当你明确只需要“存在特定详情的产品”信息时。

  3. 关于对左表自身的过滤

    对于左表本身的过滤条件(例如product.amount > 150),放在ONWHERE子句对结果集行数的影响是相同的。但出于清晰和性能考虑,建议始终放在WHERE子句中,因为WHERE是标准的对结果集进行过滤的地方。

  4. INNER JOIN的特殊情况

    INNER JOIN中,由于它只返回两个表都能匹配上的行,将过滤条件放在ON子句还是WHERE子句,最终的结果集通常是一样的。但从语义清晰和优化器理解的角度,最佳实践是:

希望这些解释和示例能帮助你彻底理解这两者的区别。如果你有具体的查询场景不确定如何设计,可以分享出来,我们一起分析。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 0:06:39

终极RSS管理指南:Fusion轻量聚合器完整使用教程

终极RSS管理指南:Fusion轻量聚合器完整使用教程 【免费下载链接】fusion A lightweight, self-hosted friendly RSS aggregator and reader 项目地址: https://gitcode.com/gh_mirrors/fusion3/fusion 在信息爆炸的今天,如何高效管理海量资讯成为…

作者头像 李华
网站建设 2026/5/14 2:35:04

springboot基于JAVA的选课系统与课程评价整合平台

目录 项目介绍 演示视频 系统展示 代码实现 推荐项目 项目开发总结 为什么选择我 源码获取 博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领…

作者头像 李华
网站建设 2026/5/22 2:35:40

学长亲荐10个AI论文软件,MBA论文写作必备!

学长亲荐10个AI论文软件,MBA论文写作必备! AI工具如何助力MBA论文高效写作 MBA论文写作是一项既考验学术能力又需要时间管理的任务。在如今人工智能技术日益成熟的背景下,越来越多的MBA学生开始借助AI工具来提升论文写作效率。这些工具不仅能…

作者头像 李华
网站建设 2026/5/23 17:32:09

开源大模型本地部署:PyTorch-CUDA-v2.6镜像 + HuggingFace缓存加速

开源大模型本地部署:PyTorch-CUDA-v2.6镜像 HuggingFace缓存加速 在AI实验室的深夜,你是否经历过这样的场景:好不容易写完一个推理脚本,准备加载Llama3-8B测试效果,结果from_pretrained()卡在“Downloading”状态整整…

作者头像 李华
网站建设 2026/5/21 16:34:26

主力散户筹码 副图 提供源码

{}散户持仓1:EMA(100*(INDEXC-LLV(INDEXL,34))/(HHV(INDEXH,34)-LLV(INDEXL,34)),3),COLORFFAA66; 主力持仓1:EMA(100*(CLOSE-LLV(LOW,34))/(HHV(HIGH,34)-LLV(LOW,34)),3),COLORMAGENTA; {} STICKLINE(散户持仓1>0,0,散户持仓1,3,0),COLORFFAA66; STICKLINE(主力持仓1>0…

作者头像 李华