我们知道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