注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

饥民2011

一直在搬砖

 
 
 

日志

 
 
 
 

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

2012-09-02 16:46:04|  分类: Oracle |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
我地都知道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),符合条件拉!

  评论这张
 
阅读(445)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017