Group和Having是很多面试官喜欢问的,下面通过一个小案例解释一下。
1.数据准备
数据准备如下:
数据准备SQL
drop table Student;
create table Student(ClassId int,StuId int ,StuName varchar(10),Chinese int,Math int);
insert into Student values(1,11,'张三',30,90);
insert into Student values(1,12,'李四',40,100);
insert into Student values(1,13,'王五',50,80);
insert into Student values(2,21,'赵六',80,20);
insert into Student values(2,22,'狗蛋',90,65);
insert into Student values(2,23,'翠花',90,50);
insert into Student values(3,31,'小美',20,50);
insert into Student values(3,32,'小丽',80,60);
insert into Student values(3,33,'小静',30,40);
commit;
2.需求
求语文平均分大于80的班级中,最高的数学成绩和ClassID
select s.ClassId,max(s.Math) a
from Student s
group by s.ClassId
having avg(s.Chinese) >80;
案例十分简单,我们简要分析。
第一个要求是语文平均分大于80的班级,对聚合后的结果进行过滤,我们首先想到用Group by和Having过滤,因为having就是对聚合后的结果集进行过滤,
第二个需求是求满足第一个需求的最高数学成绩和ClassID,分组的条件没变,可以在第一步过滤出来的结果集上进行聚合运算。