where 与having的区别

一、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)  as avg_degree  from score where cno like'3%' group by cno having count(*)>=5  order by  avg_degree 

 

---多列排序:select ename,deptno,sal from emp order by deptno asc, sal desc;

SELECT TOP 3 Sno, Cno,Grade FROM SC ORDER BY Grade DESC ---排序

select Sno,Cno from SC where Grade = (select max(Grade) from SC) ---子查询

 

三、where的效率高过having

例子:查询计算机系和信息管理系每个系的学生人数
SELECT Dept,COUNT(*) FROM Student GROUP BY Dept Having Dept in  ('计算机系','信息管理系')
SELECT Dept,COUNT(*) FROM Student  WHERE Dept in ('计算机系','信息管理系')  GROUP BY  Dept  

----第一种先分组再筛选所有系中的两个系,效率不高,第二种先筛选再分组,效率更高

 

四、在select列表项中出现的列,必须全部出现在group by后面,聚合函数除外。

错误:select deptno,job,avg(sal) from emp group by deptno;

正确:

select deptno,job,avg(sal) from emp group by deptno,job;

select deptno,avg(sal) from emp group by deptno;

 

备注

1、WHERE子句用于筛选FROM子句中指定的数据所产生的行数据。
2、GROUP BY 子句用于对经 WHERE 子句筛选后的结果数据进行分组。
3、HAVING 子句用于对分组后的统计结果再进行筛选。

4、聚合函数不能出现在from后面,where子句,group by后面

5、聚合函数可以出现在select子句,having子句,order by子句

posted @ 2020-05-26 16:28  蜕变1  阅读(718)  评论(0编辑  收藏  举报