一、where子句不能有聚合函数,having子句可以有聚合函数
SELECT MAX(Grade) 最高分,MIN(Grade) 最低分 FROM SC WHERE Cno = 'C001' --查询C001课程的最高分和最低分
SELECT Sno 学号, COUNT(*) 选课门数,AVG(Grade) 平均成绩 From SC Group BY Sno HAVING COUNT(*) > 3 ----查询选课门数超过3门的学生的学号和选课门数
二、分组子句跟在WHERE子句的后面
例子:查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。
select Cno,AVG(Degree) as '平均分' from Score group by Cno having COUNT(Cno)>=5 and Cno like'3%'
select avg(degree) from score where cno like'3%' group by cno having count(*)>=5
三、where的效率高过having
例子:查询计算机系和信息管理系每个系的学生人数
SELECT Dept,COUNT(*) FROM Student GROUP BY Dept Having Dept in ('计算机系','信息管理系')
SELECT Dept,COUNT(*) FROM Student WHERE Dept in ('计算机系','信息管理系') GROUP BY Dept
----第一种按照系分组好了之后,筛选所有系中的两个系,效率不高,第二种先进行WHERE筛选效率更高
四、备注
1、WHERE子句用于筛选FROM子句中指定的数据所产生的行数据。
2、GROUP BY 子句用于对经 WHERE 子句筛选后的结果数据进行分组。
3、HAVING 子句用于对分组后的统计结果再进行筛选。