浅谈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

分析

我们可以看到相于使用 wherehavinghaving的写法更加简洁易读
所以我们这里具体来说一下 wherehaving具体的区别
  • where

    • 一种约束声明,用来筛选创建虚拟表时的数据
    • 在虚拟表产生之前发生作用
    • where中不能使用聚合函数
  • having

    • 一种对返回数据的过滤声明,作用在已产生的虚拟表上
    • 在产生虚拟表和返回结果之间发生作用
    • having中可以使用聚合函数

总结

所以在流程上讲过程是 where ——> group by ——> having,由此我们可以推断出他们的效率
因为where是直接作用在原数据中,而 having 则要在各种分组后进行筛选,效率不言而喻
所以我们推荐常用 where 关键字,而在特殊的情况下再使用 having 关键字
posted @   21岁还不是架构师  阅读(343)  评论(1编辑  收藏  举报
编辑推荐:
· 从 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)
点击右上角即可分享
微信分享提示