浅谈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 关键字
上一篇:一条SQL执行的顺序


下一篇:InputBox函数用法小结