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

MySQL 筛选条件放 ON 后 vs 放 WHERE 后

今天我们来讲讲数据库筛选条件放 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` 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无对应用户

场景一:使用 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 > 20;

场景一写法12

写法2:条件放 WHERE

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

场景一写法12

两种写法的 结果一致写法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;

场景二写法1

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

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

场景二写法2

写法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;

场景三写法1

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

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

场景三写法2

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

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

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

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

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

http://www.gsyq.cn/news/80010.html

相关文章:

  • 明天不干是小狗
  • 2025 年面膜消费指南:告别盲目囤货,10款补水保湿抗老修护爆款适配干油敏肌,精准解决护肤痛点 - 资讯焦点
  • P4064 [JXOI2017] 加法 题解
  • 北京SAT辅导机构选课指南:高分攻略与机构测评(2025最新) - 品牌测评鉴赏家
  • 第四次作业-何玮鑫
  • 【树莓派】【v4l2】在树莓派环境下取流-编码-存储
  • P4105 [HEOI2014] 南园满地堆轻絮 题解
  • [ABC241D] Sequence Query 题解
  • Prometheus + Grafana 原理和用法
  • 2025年市场技术好的不锈钢热轧板生产厂家怎么选择,304不锈钢冷热轧板材/316L不锈钢冷热轧板材定制加工有哪些 - 品牌推荐师
  • mysql优化
  • 2026考研政治肖秀荣 408真题教材 资料提供
  • 2025.12.9博客
  • ubuntu docker运行大模型
  • 托福一对一机构怎么选?高性价比推荐+避坑指南,2025备考党必看! - 品牌测评鉴赏家
  • 疫苗的“设计图纸”如何变成现实?浅谈重组蛋白技术
  • 公式怎么写
  • 2025春季 PTA 中国大学MOOC上面的数据结构测试第三题 待修正中
  • 漏洞赏金猎人不会告诉你的秘密:从100多个已报告漏洞中总结的技巧
  • 2025.12.9
  • 深入解析:用 Paimon 做实时数据湖Flink CDC Pipeline 的 Paimon Sink 实战
  • 2025年天津低烟无卤电缆生产厂家推荐:实力企业名单请收好 - 品牌2026
  • 编译树莓派AOSP
  • 再见 Heroku:我用这个开源平台,把后端成本砍掉了 80%
  • ts + react + antd Claude.md
  • 2025北京托福机构精选指南:口碑、师资、性价比全解析
  • 我们用“平台工程”取代了 DevOps 团队,云成本降低70%
  • 实用指南:学习文本大模型的学习路径,各种大模型对比和分类以及各个大模型对硬件的要求,开源大模型有哪些
  • 3580. 寻找持续进步的员工 (单调性的模板题)
  • Linux Mint下使用vscode编译C++代码