MySQL 筛选条件放 ON后 vs 放 WHERE 后的区别解析

2025-12-10 21:50

本文主要是介绍MySQL 筛选条件放 ON后 vs 放 WHERE 后的区别解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《MySQL筛选条件放ON后vs放WHERE后的区别解析》文章解释了在MySQL中,将筛选条件放在ON和WHERE中的区别,文章通过几个场景说明了ON和WHERE的区别,并总结了ON用于关...

今天我们来讲讲数据库筛选条件放 ON 后和放 WHERE 后的区别。

ON 决定如何 "连接" 表,WHERE 决定连接后 "显示" 哪些行。 这个根本区别导致了在 LEFT JOIN / RIGHT JOIN 外连接中,条件放置位置会产生巨大影响;而在 INNER JOIN 中,效果通常 等价

ON 条件匹配 被驱动表 的行,生成 "临时关联结果集"。LEFT JOIN 会保留 驱动表 所有行,匹配不上的 被驱动表 字段填充为 NULL

WHERE 会对 "临时关联结果集" 进行条件过滤,删除不满足的行。

接下来我们搞两张测试表,一目了然。

-- 用户表(驱动表,左表)
CREATE TABLE `ysjz_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `ysjz_user` VALUES (1,'张三',18),(2,'李四',25),(3,'王五',30);
-- 订单表(被驱动表,右表)
CREATE TABLE `ysjz_order` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id`python int(11) DEFAULT NULL,
  `amount` decimal(10,2) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `ysjz_order` VALUES (1,1,100),(2,2,200),(3,2,300),(4,4,500); -- 注:user_id=4无对应用

场景一:使用&www.chinasem.cnnbsp;INNER JOIN,查询 年龄 > 20 的用户及其订单。

写法1:条件放 ON

SELECT u.*, o.* 
FROM `ysjz_user` u
INNER JOIN `ysjz_order` o ON u.id = o.user_id AND u.age &javascriptgt; 20;

MySQL 筛选条件放 ON后 vs 放 WHERE 后的区别解析

写法2:条件放 WHERE

SELECT u.*, o.* 
FROM `ysjz_user` u
INNER JOIN android`ysjz_编程order` o ON u.id = o.user_id 
WHERE u.age > 20;

MySQL 筛选条件放 ON后 vs 放 WHERE 后的区别解析

两种写法的 结果一致写法1 更高效,因少关联了 年龄 ≤ 20 的用户。

场景二:使用 LEFT JOIN保留所有用户,同时显示 年龄 > 20 的用户及其订单(≤ 20 的用户订单显示为 NULL)。

写法1:条件放 ON 后(符合要求)

SELECT u.*, o.* 
FROM `ysjz_user` u
LEFT JOIN `ysjz_order` o ON u.id = o.user_id AND u.age > 20;

MySQL 筛选条件放 ON后 vs 放 WHERE 后的区别解析

写法2:条件放 WHERE 后(跟要求不符)

SELECT u.*, o.* 
FROM `ysjz_user` u
LEFT JOIN `ysjz_order` o ON u.id = o.user_id
WHERE u.age > 20;

MySQL 筛选条件放 ON后 vs 放 WHERE 后的区别解析

写法2 将 张三 过滤了,并没有 保留所有用户。

场景三:使用 LEFT JOIN保留所有用户,同时显示 订单金额 > 200 的订单(无符合条件订单的用户填充为 NULL)。

写法1:条件放 ON 后(符合要求)

SELECT u.*, o.* 
FROM `ysjz_user` u
LEFT JOIN `ysjz_order` o ON u.id = o.user_id AND o.amount > 200;

MySQL 筛选条件放 ON后 vs 放 WHERE 后的区别解析

写法2:条件放 WHERE 后(跟要求不符)

SELECT u.*, o.* 
FROM `ysjz_user` u
LEFT JOIN `ysjz_order` o ON u.id = o.user_id 
WHERE o.amount > 200;

MySQL 筛选条件放 ON后 vs 放 WHERE 后的区别解析

写法2 过滤了 无符合条件订单的用户。

场景二 和 场景三 其实相差不大,只是条件作用的表不一样。

ON 后面优先放 "表之间的关联键"(如 u.id = o.user_id),非关联的筛选条件(如 u.age > 20)是否放 ON 后,取决于是否要保留驱动表的行。

总结:ON 管关联,WHERE 管过滤;LEFT JOIN 用 ON 保行,INNER JOIN 用 ON 提效

别人的嘴你堵不住,但自己的心却任由自己掌控。-- 烟沙九洲

到此这篇关于mysql 筛选条件放 ON后 vs 放 WHERE 后的区别解析的文章就介绍到这了,更多相关mysql on where筛选内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于MySQL 筛选条件放 ON后 vs 放 WHERE 后的区别解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1156410

相关文章

mysql_mcp_server部署及应用实践案例

《mysql_mcp_server部署及应用实践案例》文章介绍了在CentOS7.5环境下部署MySQL_mcp_server的步骤,包括服务安装、配置和启动,还提供了一个基于Dify工作流的应用案例... 目录mysql_mcp_server部署及应用案例1. 服务安装1.1. 下载源码1.2. 创建独立

Mysql中RelayLog中继日志的使用

《Mysql中RelayLog中继日志的使用》MySQLRelayLog中继日志是主从复制架构中的核心组件,负责将从主库获取的Binlog事件暂存并应用到从库,本文就来详细的介绍一下RelayLog中... 目录一、什么是 Relay Log(中继日志)二、Relay Log 的工作流程三、Relay Lo

MySQL日志UndoLog的作用

《MySQL日志UndoLog的作用》UndoLog是InnoDB用于事务回滚和MVCC的重要机制,本文主要介绍了MySQL日志UndoLog的作用,文中介绍的非常详细,对大家的学习或者工作具有一定的... 目录一、Undo Log 的作用二、Undo Log 的分类三、Undo Log 的存储四、Undo

MySQL游标和触发器的操作流程

《MySQL游标和触发器的操作流程》本文介绍了MySQL中的游标和触发器的使用方法,游标可以对查询结果集进行逐行处理,而触发器则可以在数据表发生更改时自动执行预定义的操作,感兴趣的朋友跟随小编一起看看... 目录游标游标的操作流程1. 定义游标2.打开游标3.利用游标检索数据4.关闭游标例题触发器触发器的基

Mybatis的mapper文件中#和$的区别示例解析

《Mybatis的mapper文件中#和$的区别示例解析》MyBatis的mapper文件中,#{}和${}是两种参数占位符,核心差异在于参数解析方式、SQL注入风险、适用场景,以下从底层原理、使用场... 目录MyBATis 中 mapper 文件里 #{} 与 ${} 的核心区别一、核心区别对比表二、底

MySQL查看表的历史SQL的几种实现方法

《MySQL查看表的历史SQL的几种实现方法》:本文主要介绍多种查看MySQL表历史SQL的方法,包括通用查询日志、慢查询日志、performance_schema、binlog、第三方工具等,并... 目录mysql 查看某张表的历史SQL1.查看MySQL通用查询日志(需提前开启)2.查看慢查询日志3.

MySQL底层文件的查看和修改方法

《MySQL底层文件的查看和修改方法》MySQL底层文件分为文本类(可安全查看/修改)和二进制类(禁止手动操作),以下按「查看方法、修改方法、风险管控三部分详细说明,所有操作均以Linux环境为例,需... 目录引言一、mysql 底层文件的查看方法1. 先定位核心文件路径(基础前提)2. 文本类文件(可直

MySQL数据目录迁移的完整过程

《MySQL数据目录迁移的完整过程》文章详细介绍了将MySQL数据目录迁移到新硬盘的整个过程,包括新硬盘挂载、创建新的数据目录、迁移数据(推荐使用两遍rsync方案)、修改MySQL配置文件和重启验证... 目录1,新硬盘挂载(如果有的话)2,创建新的 mysql 数据目录3,迁移 MySQL 数据(推荐两

MybatisPlus中几种条件构造器运用方式

《MybatisPlus中几种条件构造器运用方式》QueryWrapper是Mybatis-Plus提供的一个用于构建SQL查询条件的工具类,提供了各种方法如eq、ne、gt、ge、lt、le、lik... 目录版本介绍QueryWrapperLambdaQueryWrapperUpdateWrapperL

Agent开发核心技术解析以及现代Agent架构设计

《Agent开发核心技术解析以及现代Agent架构设计》在人工智能领域,Agent并非一个全新的概念,但在大模型时代,它被赋予了全新的生命力,简单来说,Agent是一个能够自主感知环境、理解任务、制定... 目录一、回归本源:到底什么是Agent?二、核心链路拆解:Agent的"大脑"与"四肢"1. 规划模