欢迎来到.net学习网

欢迎联系站长一起更新本网站!QQ:879621940

您当前所在位置:首页 » Sql随手笔记 » 正文

热门阅读

Sql Server中where与having的区别

创建时间:2011年12月01日 23:47  阅读次数:(6240)
分享到:
我们知道where与having都起到数据过滤的作用。那么,where与having到底有什么区别呢?

having总是和group by一起出现,它的作用是对经过group by聚合后的数据进行过滤,比如下面SQL:
select gid,count(*) as qtynumber from Storage_Goods group by having count(1) >3

该SQL语句的意思是,先统计gid中的值在storage_goods表中出次的次数,然后再过滤掉出现次数小于等于3的数据,也就是说,他们先分组,再过滤。这就和where有本质的区别了,因为在有where的sql语句,where子句总是优先于列的选取及列中的聚合函数的执行的,这两者的执行顺序是相反的。

我们可以做个测试:
create table #t
(
name varchar(50),
sex varchar(10),
salary decimal(18,4)
)

insert into #t(name,sex,salary) 
select '李一','男',2000 
union all
select '王二','男',3000
union all
select '张三','男',3000
union all
select '王芳','女',4500

--下面sql查询所有性别为男的员工的工资情况
select * from #t where sex='男'

--下面sql先汇总出每个工资级别的员工数量,再过滤掉工资小于等于2000这个级别的数据
select salary,count(1) as qtynumber from #t group by salary having salary >2000 

--下面sql先汇总出不同性别的不同工资级别的员工数量,再过滤掉性别为女和工资小于等2000这个级别的数据
select salary,sex,count(1) as qtynumber from #t group by salary,sex having salary >2000 and sex='男'

drop table #t

总结:
1,where group by是先根据条件过滤再聚合
2,group by having是先聚合再过滤条件
这两者的本资区别就在于它们的执行顺序,还有一点,在having中可以使用聚合函数,而where中是不可以。如上面中的例子:
select gid,count(*) as qtynumber from Storage_Goods group by having count(1) >3

知道了它们间的区别,我们就可以理解这条sql的意思了,这个sql的意思就是查询出在Storage_Goods表中,gid列有重复三次以上的所有数据,而这个用where是查询不出来的。7
来源:.net学习网
说明:所有来源为 .net学习网的文章均为原创,如有转载,请在转载处标注本页地址,谢谢!
【编辑:Wyf

打赏

取消

感谢您的支持,我会做的更好!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

最新评论

共有评论0条
  • 暂无任何评论,请留下您对本文章的看法,共同参入讨论!
发表评论:
留言人:
内  容:
请输入问题 10+90=? 的结果(结果是:100)
结  果: