select * from dbo.student
select salary,AVG(grade)
from dbo.student
where salary >= 2000
group by salary
having salary <= 5000
having 【对分组之后的信息进行过滤】
1.having子句是用来对分组一家之言后的数据进行过滤因此使用having时通常都会先使用 group by
-
如果没使用 group by 但使用了having 则意味着 having 把所有的记录当作一组来进行过滤
极少用
select COUNT(*)
from dbo.student
having AVG(dbo.student) > 2000 -
having 子句出现的字段必须的是分组之后的组的整体信息
having 子句不允许出现组内的详细信息 -
尽管 select 字段可以出现别名
但是having子句中不能出现字段的别名,只能使用字段最原始的名字
原因不得而知
5.having 和 where 的异同
相同的:
都是对数据过滤,只保留有效的数据
不同:
where 是对原始的记录过滤 having 是对分组之后的记录过滤
where 必须的写在 having 的前面,顺序不可颠倒否则运行出错
例子:
select salary,AVG(grade),COUNT(*),MIN(),SUM()
from dbo.student
where salary >= 2000 --因为where是对原始的数据过滤 不能使用聚合函数 因为还没有分组
group by salary
having salary <= 5000 --对分组之后的记录过滤select salary,count(),grade
from dbo.student
where salary > 2000
group by salary , grade
having count() > 2000
order by salary desc