|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
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)操作之前的数据状态原文。 |
|