仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1079|回复: 8
打印 上一主题 下一主题

[学习教程] Sql Server中where与having的区分

[复制链接]
莫相离 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 14:07:10 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
提供多语言支持,常见的编码如中文的GB2312、BIG5,日文的Shift_JIS等都可以用作数据表名和数据列名。我们晓得where与having都起到数据过滤的感化。那末,where与having究竟有甚么区分呢?

having老是和groupby一同呈现,它的感化是对经由groupby聚合后的数据举行过滤,好比上面SQL:
selectgid,count(*)asqtynumberfromStorage_Goodsgroupbyhavingcount(1)>3

该SQL语句的意义是,先统计gid中的值在storage_goods表中出次的次数,然后再过滤失落呈现次数小于即是3的数据,也就是说,他们先分组,再过滤。这就和where有实质的区分了,由于在有where的sql语句,where子句老是优先于列的拔取及列中的聚合函数的实行的,这二者的实行按次是相反的。

我们能够做个测试:
createtable#t
(
namevarchar(50),
sexvarchar(10),
salarydecimal(18,4)
)

insertinto#t(name,sex,salary)
select李一,男,2000
unionall
select王二,男,3000
unionall
select张三,男,3000
unionall
select王芳,女,4500

--上面sql查询一切性别为男的员工的人为情形
select*from#twheresex=男

--上面sql先汇总出每一个人为级其余员工数目,再过滤失落人为小于即是2000这个级其余数据
selectsalary,count(1)asqtynumberfrom#tgroupbysalaryhavingsalary>2000

--上面sql先汇总出分歧性其余分歧人为级其余员工数目,再过滤失落性别为女和人为小于等2000这个级其余数据
selectsalary,sex,count(1)asqtynumberfrom#tgroupbysalary,sexhavingsalary>2000andsex=男

droptable#t

总结:
1,wheregroupby是先依据前提过滤再聚合
2,groupbyhaving是先聚合再过滤前提
这二者的本资区分就在于它们的实行按次,另有一点,在having中可使用聚合函数,而where中是不成以。如下面中的例子:
selectgid,count(*)asqtynumberfromStorage_Goodsgroupbyhavingcount(1)>3

晓得了它们间的区分,我们就能够了解这条sql的意义了,这个sql的意义就是查询出在Storage_Goods表中,gid列有反复三次以上的一切数据,而这个用where是查询不出来的。恢复到之前的某个状态,是需要数据的。这数据可以是a)回滚步骤或者b)操作之前的数据状态原文。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-15 03:38

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表