news 2026/3/31 13:33:00

SQL 中“过滤条件”写在 SELECT、JOIN 和 WHERE 的区别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SQL 中“过滤条件”写在 SELECT、JOIN 和 WHERE 的区别

1. SELECT 子句中的过滤

作用

SELECT子句本身并不用于直接过滤数据行,而是用于表达式计算和返回结果列。
但有两种特殊“伪过滤”情况,初学者容易混淆:

a) 使用CASE WHEN生成标志位

SELECTid,amount,CASEWHENamount>500THEN'大额'ELSE'小额'ENDASgradeFROMorders;

这里只是标记,并没有“过滤”数据行。

b) 利用窗口函数的FILTER

SELECTSUM(amount)FILTER(WHEREtype='A')ASsum_a,SUM(amount)FILTER(WHEREtype='B')ASsum_bFROMorders;

这里的FILTER是对聚合函数的聚合过滤,不影响整行是否被选中,只决定聚合时哪些被算上。

总结

SELECT 不能直接过滤结果行(除了各种聚合“过滤”标志)。真正过滤结果应放在WHEREJOINHAVING


2. JOIN 子句中的过滤(ON 条件)

JOINON部分与WHERE条件不同:

a) INNER JOIN

SELECT*FROMaJOINbONa.id=b.a_idANDb.status='active'

解析

  • b.status = 'active'写在ON内,只有满足 a.id=b.a_id 且 b.status=‘active’ 时,才产生一对结果
  • 即,在关联时,提前筛选对方表的相关数据

b) LEFT JOIN

SELECT*FROMaLEFTJOINbONa.id=b.a_idANDb.status='active'

解析

  • LEFT JOIN不管 b 有无匹配,总会保留 a。
  • ON过滤是:如果 b.status 不为 ‘active’,则 b 列为 NULL;不会把整行 a 去掉。

c) 过滤条件写在 WHERE

SELECT*FROMaLEFTJOINbONa.id=b.a_idWHEREb.status='active'

解析

  • 此写法:WHERE条件会把 a 的那些 b 没有匹配到的(所有 b 为 NULL 的)全部去掉,实际上结果和 INNER JOIN 效果一样!

3. WHERE 子句中的过滤

WHERE负责数据源(包括 join 后的中间结果)的最终行过滤

SELECT*FROMaJOINbONa.id=b.a_idWHEREa.amount>100ANDb.status='active'
  • 先连接,再整体过滤。

4. 典型案例对比

假如有如下两个表:

  • students(id, name)
  • scores(student_id, subject, mark)

假设每个学生有多个成绩。


场景1:只看及格成绩

条件写在JOIN:

SELECTs.id,s.name,sc.markFROMstudents sJOINscores scONs.id=sc.student_idANDsc.mark>=60

🚩只有及格的匹配行会被连接,学生不会重复出现不及格的成绩。


条件写在WHERE:

SELECTs.id,s.name,sc.markFROMstudents sJOINscores scONs.id=sc.student_idWHEREsc.mark>=60

🚩结果一样:只显示及格成绩。


LEFT JOIN + 过滤条件写在JOIN:

SELECTs.id,s.name,sc.markFROMstudents sLEFTJOINscores scONs.id=sc.student_idANDsc.mark>=60

🚩每个学生会显示所有自己及格的成绩,没及格就为 NULL,但学生都在。


LEFT JOIN + 过滤条件写在WHERE:

SELECTs.id,s.name,sc.markFROMstudents sLEFTJOINscores scONs.id=sc.student_idWHEREsc.mark>=60

🚩所有没及格的行(包括没考试的、sc.mark是NULL),全部被过滤掉,效果和INNER JOIN一样!

注意:LEFT JOIN+WHERE条件,在想保留主表(比如students)所有数据但只展示部分关联的情况下,要特别小心写法。


5. 总结表格

过滤条件位置作用对象推荐场景
SELECT只对输出列做条件标记、赋值需展示条件分组/标识
JOIN (ON)只影响表之间的连接配对关系只过滤被联接表时,主表全保留
WHERE影响整个结果最终输出行需要严格筛选全部输出的情况

一句话总结

  • 只保留主表相关数据LEFT JOIN ... ON ...
  • 真正只显示符合条件整行WHERE
  • 用于联表附加限定,不影响主表全保留JOIN ON
  • SELECT只做数据衍生、打标,不过滤行

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

多模态骨骼检测方案:RGBD相机+云端AI,精度提升40%

多模态骨骼检测方案:RGBD相机云端AI,精度提升40% 引言 在康复机器人领域,精确的人体骨骼检测是核心技术之一。传统单目摄像头方案存在一个致命问题:由于缺乏深度信息,检测误差经常超过10cm,严重影响康复训…

作者头像 李华
网站建设 2026/3/24 9:46:22

医疗康复评估系统:高精度骨骼点检测云端方案

医疗康复评估系统:高精度骨骼点检测云端方案 引言 在康复医疗领域,精确测量患者关节活动度是评估康复效果的关键指标。传统方法依赖昂贵的医疗级检测设备,动辄数十万元的投入让许多中小型康复机构望而却步。现在,基于AI的骨骼点…

作者头像 李华
网站建设 2026/3/20 8:54:46

从零开始使用AI人脸隐私卫士:本地离线人脸打码教程

从零开始使用AI人脸隐私卫士:本地离线人脸打码教程 1. 引言 1.1 学习目标 在数字化时代,图像和视频中的人脸信息极易被滥用,尤其是在社交媒体、监控系统或公开资料发布场景中。如何在不依赖云端服务的前提下,快速、安全地对敏感…

作者头像 李华
网站建设 2026/3/30 19:28:40

AI手势识别如何嵌入App?移动端集成路径详解

AI手势识别如何嵌入App?移动端集成路径详解 1. 引言:AI 手势识别与人机交互新范式 随着智能设备的普及和用户对自然交互方式的需求增长,AI手势识别技术正逐步从实验室走向消费级应用。传统触控操作虽成熟稳定,但在特定场景下&am…

作者头像 李华
网站建设 2026/3/28 10:16:27

亲测好用9个AI论文网站,助本科生轻松搞定毕业论文!

亲测好用9个AI论文网站,助本科生轻松搞定毕业论文! AI 工具如何成为论文写作的得力助手 在当前高校教育中,毕业论文已成为本科生必须面对的重要任务。随着人工智能技术的发展,越来越多的 AI 工具被引入到学术写作中,帮…

作者头像 李华
网站建设 2026/3/30 21:35:09

多角度手部检测准吗?AI手势识别泛化能力测试

多角度手部检测准吗?AI手势识别泛化能力测试 1. 引言:AI 手势识别与人机交互的边界挑战 随着智能硬件和自然用户界面(NUI)的发展,AI手势识别正逐步从实验室走向消费级应用。无论是AR/VR中的虚拟操控、智能家居的隔空…

作者头像 李华