分组选择数据【educoder】+笔记+答案

340 阅读3分钟

文章目录


分组可以将一个整表分为多个逻辑组,以便能对每个组进行聚集计算。

一:group by与聚合函数

语法规则
select 【聚合函数】字段名 from 表名 【where查询条件】【group by字段名】
编程要求
在右侧编辑器补充代码,对年级Id和性别进行分组,分别统计表中2、3、4年级的男生总人数和女生总人数。
student表数据结构如下:
stuId gradeId sex
0201 2 男
0221 2 男
0319 3 女
0508 5 男
0610 6 女
0101 1 男
0224 2 女
0413 4 女
要求输出结果显示如下:

在这里插入图片描述

USE School;

#请在此处添加实现代码
########## Begin ##########

#1.查询表中2,3,4年级中分别男女的总人数

select gradeId,sex,count(*) from student where gradeId in(2,3,4) group by gradeId,sex;


########## End ##########

二:使用having与order by

语法:
select [聚合函数] 字段名 from 表名 [where 查询条件] [group by 字段名] [having 字段名 筛选条件]

Having与Where的区别
where子句都可以用having代替,区别在于where过滤行,having过滤分组;

where子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,where条件中不能包含聚组函数,使用where条件过滤出特定的行;

having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件过滤出特定的组,也可以使用多个分组标准进行分组。
编程要求
根据提示,在右侧编辑器补充代码:
我们要评选三好学生,条件是至少有两门课程在90分以上(包括90分)才能有资格,请列出符合的学生的学号(sno)及其90分以上(包括90分)科目总数;
学校评选先进学生,要求平均成绩大于90分(包括90分)的学生都有资格,并且语文课必须在95分以上(包括95分),请列出有资格的学生的学号(sno)及其科目的平均分。
给定数据表tb_grade格式如下:
sno pno score
1 语文 95
1 数学 98
1 英语 90
2 语文 89
2 数学 91
2 英语 92
3 语文 85
3 数学 88
3 英语 96
4 语文 95
4 数学 89
4 英语 88

USE School;

#请在此处添加实现代码
########## Begin ##########

#1.查询表中至少有两门课程在90分以上的学生信息
select sno,count(*) from tb_grade where score >= 90 group by sno having count(sno) >= 2;


#2.查询表中平均成绩大于90分且语文课在95分以上的学生信息

select sno,avg(score) from tb_grade where sno in (select sno from tb_grade where score >= 95 and pno="语文") group by sno having avg(score) >= 90;
########## End ##########