而且having 一般和group by 一齐使用, 但是where 也可以用group by 一齐使用的。
下面用个简单例子讲解下:
有一张分数表Grade_1, 3个column 分别是 dep, name 和 grade, 如下图,好明显可以用部门dep来分组. 表中总共9条数据
下面语句是用来列出所有部门的总分。 并没有用到where 和 having 字句。
select dep as Dep,sum(grade) as Sum_grade
from Grade_1
group by dep
可以见到3个组的总分都列出来了。 呢个唔难理解。
where 子句:
下面用1个where字句, 意思是列出所有部门分数大于或等于60分的人的总分
select dep as Dep,sum(grade) as Sum_grade
from Grade_1
where grade >= 60
group by dep
可以见到, 部门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
可以见到 结果把整个第一组排除出去了, 是因为
第一组有个人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
可以见到第一组又出来了, 之前不是说第一组的最低分是40吗?
答案都好简单,因为分组前 where字句先起作用, 把分数小于60的数据都排除出去了,
分组后
当having子句起作用时, 第一分组已经不包含小于60的数据(Allen), 所以第一分组这是的最低分是60(Jason),符合条件拉!