仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1208|回复: 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)操作之前的数据状态原文。
因胸联盟 该用户已被删除
沙发
发表于 2015-1-16 18:46:23 | 只看该作者

Sql Server中where与having的区分

而写到本地,我又考虑到效率问题.大家来讨论讨论吧,分数不打紧,就给10分,十全十美,没啥对错,各抒己见,但是要有说服力的哦~
小女巫 该用户已被删除
板凳
发表于 2015-1-18 18:58:10 | 只看该作者
而写到本地,我又考虑到效率问题.大家来讨论讨论吧,分数不打紧,就给10分,十全十美,没啥对错,各抒己见,但是要有说服力的哦~
乐观 该用户已被删除
地板
发表于 2015-2-5 14:50:17 | 只看该作者
你觉得我的非分区索引无法对起子分区,你可以提醒我一下呀!没有任何的提醒,直接就变成了非分区表。不知道这算不算一个bug。大家也可以试试。
精灵巫婆 该用户已被删除
5#
发表于 2015-2-12 09:44:17 | 只看该作者
所以你总能得到相应的升级版本,来满足你的需求。
兰色精灵 该用户已被删除
6#
发表于 2015-3-3 02:40:03 | 只看该作者
SP4包括用于以下SQLServer2000组件的程序包:Database组件(下载文件:SQL2000-KB884525-SP4-x86.EXE)更新SQLServer2000的32位Database组件,包括数据库引擎、复制、客户端连接组件及工具。有关其他信息,请参阅ReadmeSql2k32Sp4.htm。AnalysisServices组件(下载文件:SQL2000.AS-KB884525-SP4-x86.EXE)更新SQLServer2000的32位AnalysisServices。
7#
发表于 2015-3-11 09:11:15 | 只看该作者
大侠们有推荐的书籍和学习方法写下吧。
冷月葬花魂 该用户已被删除
8#
发表于 2015-3-18 08:08:54 | 只看该作者
一个百万级别的基本信息表A,一个百万级别的详细记录表B,A中有个身份证id,B中也有身份id;先要找出A中在B的详细记录。
第二个灵魂 该用户已被删除
9#
发表于 2015-3-25 20:25:57 | 只看该作者
也可谈一下你是怎么优化存储过程的?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-22 17:54

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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