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

我地都知道sql 中 where 和 having 都是用来筛选条件的关键字。

而且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),符合条件拉!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nvd11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值