莫相离 发表于 2015-1-16 14:07:10

Sql Server中where与having的区分

提供多语言支持,常见的编码如中文的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。大家也可以试试。

精灵巫婆 发表于 2015-2-12 09:44:17

所以你总能得到相应的升级版本,来满足你的需求。

兰色精灵 发表于 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。

仓酷云 发表于 2015-3-11 09:11:15

大侠们有推荐的书籍和学习方法写下吧。

冷月葬花魂 发表于 2015-3-18 08:08:54

一个百万级别的基本信息表A,一个百万级别的详细记录表B,A中有个身份证id,B中也有身份id;先要找出A中在B的详细记录。

第二个灵魂 发表于 2015-3-25 20:25:57

也可谈一下你是怎么优化存储过程的?
页: [1]
查看完整版本: Sql Server中where与having的区分