news 2026/6/10 21:25:07

HoRain云--MySQL中ON与WHERE的区别解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HoRain云--MySQL中ON与WHERE的区别解析

🎬 HoRain云小助手:个人主页

🔥 个人专栏: 《Linux 系列教程》《c语言教程》

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


⛳️ 推荐

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

专栏介绍

专栏名称

专栏介绍

《C语言》

本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。

《网络协议》

本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制!

《docker容器精解篇》

全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。

《linux系列》

本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。

《python 系列》

本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。

《试题库》

本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等)

目录

⛳️ 推荐

专栏介绍

🔧 关键差异详解

📌 举例说明

💡 使用建议


在 MySQL 中,JOIN ... ON子句中的多个条件和WHERE子句中的条件,虽然都用于筛选数据,但它们的执行时机和影响范围不同,这会直接导致查询结果的差异。理解这些区别对编写正确、高效的 SQL 查询至关重要。

特性

ON子句中的条件 (连接条件)

WHERE子句中的条件 (过滤条件)

执行时机

连接过程中执行

连接完成后执行

主要作用

定义表之间的连接规则

对连接后产生的最终结果集进行过滤

对左外连接(LEFT JOIN)的影响

条件不满足时,仍返回左表所有记录,右表字段以NULL填充

条件不满足时,整行记录都会被过滤掉,可能使LEFT JOIN“失效”

对内连接(INNER JOIN)的影响

效果与在WHERE子句中指定条件基本相同

效果与在ON子句中指定条件基本相同

🔧 关键差异详解

核心区别在于ON条件是用来生成结果集的,而WHERE条件是用来从已生成的结果集中进行筛选的。

📌 举例说明

通过一个具体的例子可以更直观地理解。假设有两个表:

场景一:条件放在ON子句中

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

查询结果:会返回product表的所有 4 条记录。对于id为 4 的产品,能匹配到exist=1的详情,所以详情字段有值。对于id为 2 的产品,虽然能匹配到详情,但exist不为 1,所以详情字段为NULLid为 1 和 3 的产品无匹配详情,详情字段也为NULL

product.id

amount

product_details.id

weight

exist

1

100

NULL

NULL

NULL

2

200

NULL

NULL

NULL

3

300

NULL

NULL

NULL

4

400

4

44

1

场景二:条件放在WHERE子句中

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

查询结果:只会返回 1 条记录,即同时满足id匹配和exist=1的记录。因为WHERE子句在连接后过滤掉了所有不满足product_details.exist = 1的行,包括那些右表为NULL的行。

product.id

amount

product_details.id

weight

exist

4

400

4

44

1

💡 使用建议

  1. 明确你的意图

  2. 关于 INNER JOIN

    对于INNER JOIN,由于它只返回两个表都能匹配上的记录,因此将条件放在ON子句还是WHERE子句,最终的结果集是相同的。但从逻辑清晰性和可读性角度,通常将纯粹的连接条件(如表关联字段相等)放在ON子句,将通用的业务过滤条件放在WHERE子句。

  3. 性能考量

    在大多数情况下,现代的数据库查询优化器能够对INNER JOINONWHERE条件进行相同的处理。但对于外连接(LEFT/RIGHT JOIN),由于语义不同,执行计划可能会有所不同。遵循正确的语义通常也能让优化器更好地工作。

合理地使用ONWHERE,可以帮助你精准地控制查询结果。希望这些解释和示例对你有帮助!如果你有具体的查询场景感到困惑,欢迎提供出来,我们可以一起分析。

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

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

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

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

太原代写标书机构

太原代写标书机构:专业服务助力项目成功引言在激烈的市场竞争中,一份高质量的标书是企业中标的关键。太原作为山西省的省会城市,拥有众多优质的代写标书机构,为企业提供专业的标书编写服务。本文将深入探讨太原代写标书机构的服务…

作者头像 李华
网站建设 2026/6/10 12:52:53

人物静止镜头更适合HeyGem处理?动态画面适配分析

人物静止镜头更适合HeyGem处理?动态画面适配分析 在虚拟主播、企业宣传和在线教育日益依赖数字人内容的今天,AI驱动的口型同步技术正以前所未有的速度改变视频生产方式。像 HeyGem 这样的语音驱动数字人生成系统,让用户只需一段音频和一张人…

作者头像 李华
网站建设 2026/6/10 11:48:11

【2025最新】基于SpringBoot+Vue的志愿服务管理系统管理系统源码+MyBatis+MySQL

摘要 随着社会公益事业的快速发展,志愿服务管理的信息化需求日益增长。传统志愿服务管理模式依赖人工记录和纸质档案,存在效率低下、数据易丢失、信息共享困难等问题。数字化管理系统的引入能够有效提升志愿服务的组织效率,实现志愿者、活动、…

作者头像 李华
网站建设 2026/6/10 12:27:23

Java SpringBoot+Vue3+MyBatis 智慧草莓基地管理系统系统源码|前后端分离+MySQL数据库

摘要 随着现代农业技术的快速发展,智慧农业成为提升农业生产效率和管理水平的重要方向。草莓种植作为高附加值农业产业,对环境和管理的精细化要求较高,传统的人工管理模式难以满足现代草莓基地的需求。智慧草莓基地管理系统通过信息化手段整合…

作者头像 李华
网站建设 2026/6/10 14:19:58

【C# Span性能优化终极指南】:揭秘高效内存管理的5大核心技巧

第一章:C# Span性能优化概述在高性能编程场景中,数据的高效访问与内存管理是关键瓶颈。C# 中的 Span 类型为栈和托管堆上的连续内存提供了统一、安全且无额外开销的抽象,极大提升了处理字符串、数组和原生内存时的性能表现。Span的核心优势 避…

作者头像 李华
网站建设 2026/6/9 19:59:55

基于java+ vue小区物业管理系统(源码+数据库+文档)

小区物业管理 目录 基于springboot vue小区物业管理系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取: 基于springboot vue小区物业管理系统 一、前言 博主介绍&…

作者头像 李华