浅谈SQL中的 where 和 having 的区别
基本语法知识
提到where和having是我们平时经常用到的关键字,一起用到的免不了还有 group by
我们分别先简单说一下每个关键字的用法
where:用于提取那些满足指定条件的记录。
having:筛选分组后的各组数据
group by:通常搭配聚合函数来使用
我们通过一个例题来深刻理解这几个关键字的用法
例题
有一个courses 表 ,有: student (学生) 和 class (课程)。
请列出所有超过或等于5名学生的课。
例如,表:
student | calss |
---|---|
A | Math |
B | English |
C | Math |
D | Biology |
E | Math |
F | Computer |
G | Math |
H | Math |
I | Math |
应该输出:
class |
---|
Math |
解答
-- 方法一
select class from
(select class, count(Distinct student) nums
from courses
group by class)
where nums >= 5
-- 方法二
select class
from courses
group by class
having count(distinct student)>=5
分析
我们可以看到相于使用 where 和 having ,having的写法更加简洁易读
所以我们这里具体来说一下 where 和 having具体的区别
-
where
- 一种约束声明,用来筛选创建虚拟表时的数据
- 在虚拟表产生之前发生作用
- where中不能使用聚合函数
-
having
- 一种对返回数据的过滤声明,作用在已产生的虚拟表上
- 在产生虚拟表和返回结果之间发生作用
- having中可以使用聚合函数
总结
所以在流程上讲过程是 where ——> group by ——> having,由此我们可以推断出他们的效率
因为where是直接作用在原数据中,而 having 则要在各种分组后进行筛选,效率不言而喻
所以我们推荐常用 where 关键字,而在特殊的情况下再使用 having 关键字
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)