浅谈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 关键字