详解在group by分组查询中where 和 having的用法和区别。

时间:2022-06-23 18:43:42
我地都知道sql 中 where 和 having 都是用来筛选条件的关键字。

而且having 一般和group by 一齐使用,   但是where 也可以用group by 一齐使用的。

下面用个简单例子讲解下:
有一张分数表Grade_1,   3个column 分别是 dep, name 和 grade,  如下图,好明显可以用部门dep来分组. 表中总共9条数据
详解在group by分组查询中where 和 having的用法和区别。

下面语句是用来列出所有部门的总分。 并没有用到where 和 having 字句。

select dep as Dep,sum(grade) as Sum_grade
from Grade_1
group by dep

详解在group by分组查询中where 和 having的用法和区别。

可以见到3个组的总分都列出来了。 呢个唔难理解。


where 子句:
下面用1个where字句, 意思是列出所有部门分数大于或等于60分的人的总分

select dep as Dep,sum(grade) as Sum_grade
from Grade_1
where grade >= 60
group by dep

详解在group by分组查询中where 和 having的用法和区别。

可以见到, 部门1 和 部门2的总分 都比上面的总分数减少了
是因为 where字句的作用,  语句在 分组前 把第1组的  Allen(40分)
和 第二组的piero (45分) 排除掉了。
第一组和第二组实际上都是其余两个人的总分,

所以可总结出:
1. where字句用在group by之前。
2. where 作用于单个记录(行)
3. where 作用生效后(筛选后), group by分组才生效, 也就是where字句作用于 group by 之前。


Having 子句:
下面用1个Having字句, 意思是列出最低分数大于40的部门的总分

select dep as Dep,sum(grade)  as Sum_grade
from Grade_1

group by dep
having min(grade) > 40

详解在group by分组查询中where 和 having的用法和区别。

可以见到 结果把整个第一组排除出去了, 是因为
第一组有个人Allen的分数不大于40  也就是说  第一组的最低分是40, 不符合条件。

所以可总结出:
1. having 字句用在group by之后。
2. having 字句 作用于单个组(1行或多行)
3. group by 分组后,  才用having 子句来分组, 所以having字句作用在分组之后。



where 和 having 子句一齐使用:
下面语句就是上面两个条件一齐使用,

select dep as Dep,sum(grade)  as Sum_grade
from Grade_1
where grade >= 60
group by dep
having min(grade) > 40

详解在group by分组查询中where 和 having的用法和区别。

可以见到第一组又出来了,  之前不是说第一组的最低分是40吗?

答案都好简单,因为分组前 where字句先起作用, 把分数小于60的数据都排除出去了,
分组后
当having子句起作用时,  第一分组已经不包含小于60的数据(Allen), 所以第一分组这是的最低分是60(Jason),符合条件拉!