1、查询每门课程都大于80的同学姓名(student)
- 前提:创建student表插入数据:
insert into `sql`.`student` (`name`, `course`, `score`) values ('陈玲', '语文', '88'); insert into `sql`.`student` (`name`, `course`, `score`) values ('陈玲', '数学', '90'); insert into `sql`.`student` (`name`, `course`, `score`) values ('陈玲', '英语', '98'); insert into `sql`.`student` (`name`, `course`, `score`) values ('胡云峰', '语文', '78'); insert into `sql`.`student` (`name`, `course`, `score`) values ('胡云峰', '数学', '80'); insert into `sql`.`student` (`name`, `course`, `score`) values ('胡云峰', '英语', '85'); insert into `sql`.`student` (`name`, `course`, `score`) values ('邓兰', '语文', '88'); insert into `sql`.`student` (`name`, `course`, `score`) values ('邓兰', '数学', '70'); insert into `sql`.`student` (`name`, `course`, `score`) values ('邓兰', '英语', '68');
查询结果:
1. 首先我们要通过group by
对姓名组合进行查询
select name from student group by name
查询结果:
2. 然后用min()聚合函数对每位同学最低的分数查询出来
select name,min(score) from student group by name
查询结果:
3. 再用having筛选出最低分数都大于80的同学
select name,min(score) from student group by name having min(score)>80
查询结果:
4. 最后一步,因为我们只查询学生的姓名,不用查询分数,所以我们再嵌套一层函数,来只查询姓名即可
select name from (select name,min(score) from student group by name having min(score)>80) student
查询结果:
PS:关于聚合函数
- 聚合函数,顾名思义,就是将多条数据聚合成一条数据的函数(从N到1)
- 常用的聚合函数有:
max(),min(),sum(),avg(),count()
- 其他:
group by
通常与聚合函数一起,用来(分组数据),having
则用来(筛选条件)
2、行转为列查询(case/when/then/else/end/as)
- student表中course列出现了大量重复的数据,所以合并成列名,方便观看使用
1.我们可以使用(case/when/then/)进行转化:
select name, sum(case course when '语文' then score else 0 end) as '语文', sum(case course when '数学' then score else 0 end) as '数学', sum(case course when '英语' then score else 0 end) as '英语' from student group by name
2.或者也可以用if进行转化,效果也是一样的:
select name, sum(if(course='语文',score,0)) as '语文', sum(if(course='数学',score,0)) as '数学', sum(if(course='英语',score,0)) as '英语' from student group by name
之前的查询结果
转为列之后的查询结果:
3、对总成绩进行排名
1.首先我们通过rollup
把总成绩算出来:
select ifnull(name,'总成绩') as name, sum(if(course='语文',score,0)) as '语文', sum(if(course='数学',score,0)) as '数学', sum(if(course='英语',score,0)) as '英语', sum(score) as '总成绩' from student group by name with rollup
查询结果: