目录
相关表数据:
题目及思路解析:
查询结果排序&分组指定条件
1、查询学生的总成绩并按照总成绩降序排序
2、按照如下格式显示学生的语文、数学、英语三科成绩,没有成绩的输出为0,按照学生的有效平均成绩降序显示
3、查询一共参加三门课程且其中一门为语文课程的学生的id和姓名
总结归纳:
知识补充:
相关表数据:
1、student_info
2、course_info
3、score_info
题目及思路解析:
查询结果排序&分组指定条件
1、查询学生的总成绩并按照总成绩降序排序
代码:
select
stu_id,
sum(score) total_score
from score_info
group by stu_id
order by total_score desc ;
思路分析:
首先进行分组,获取到每位学生的所有(参加考试的)课程的成绩,接着使用sum()函数求和,按照题目要求进行输出。
注:这里使用sum(),不可以用count(),因为count()求的是表的行数
结果:
2、按照如下格式显示学生的语文、数学、英语三科成绩,没有成绩的输出为0,按照学生的有效平均成绩降序显示
输出显示 :学生id 语文 数学 英语 有效课程数 平均成绩
这里结果需要输出有效课程, 参加考试(在表中有成绩)的课程数
代码:
方法1:
Tips: 使用sum(if())函数判断
select
stu_id,
sum(if(course_name='语文',score,0)) `语文`,
sum(if(course_name='数学',score,0)) `数学`,
sum(if(course_name='英语',score,0)) `英语`,
count(*) `有效课程`,
avg(score) `平均成绩`
from score_info
join course_info
on score_info.course_id=course_info.course_id
group by stu_id
order by avg(score) desc;
思路:
首先在score_info表中进行按照stu_id分组,得到每位学生的所有(参加考试的)课程的成绩,接着join连接course_info表得到语文、数学、英语对应的course_id, 然后使用sum(if())输出三个课程的成绩,最后按照题目要求输出内容
注:
`count(*)即score_info表中的行数(即每个人有成绩的课程数)
`avg(score)即所有参考课程成绩的平均值
`sum(if(a,b,c))即如果满足a条件则输出b(若b非空),否则输出c
方法2:
Tips: 使用nvl()函数判断
select
t4.stu_id,
nvl(t1.score,0) `语文`,
nvl(t2.score,0) `数学`,
nvl(t3.score,0) `英语`
from
(select
stu_id,
score
from score_info
where course_id='01'
)t1
full join
(select
stu_id,
score
from score_info
where course_id='02'
)t2
on t1.stu_id=t2.stu_id
full join
(select
stu_id,
score
from score_info
where course_id='03'
)t3
on nvl(t1.stu_id,t2.stu_id)=t3.stu_id
full join
(select
stu_id,
count(*) cnt,
avg(score) avg_score
from score_info
group by stu_id
)t4
on coalesce(t1.stu_id,t2.stu_id,t3.stu_id)=t4.stu_id;
思路:
首先获取有语文,有数学,有英语成绩的学生,以及统计课程数查询,平均成绩查询,
接着通过stu_id进行满外连接,最后进行嵌套输出题目要求的内容
注:使用满外连接的原因
因为题目要求输出三科的成绩,但可能存在只有其中某一科或两科成绩的学生,这样才能在最后按照要求输出三科成绩
结果:
3、查询一共参加三门课程且其中一门为语文课程的学生的id和姓名
代码:
select
t2.stu_id id,
stu_name `姓名`
from
(
select
t1.stu_id
from
( select
stu_id,
course_id
from score_info
where stu_id
in (select
stu_id
from score_info
join course_info
on score_info.course_id=course_info.course_id
where course_name='语文')
)t1
group by t1.stu_id
having count(t1.course_id)=3
)t2
join student_info
on t2.stu_id=student_info.stu_id;
思路:
本题主要是嵌套查询,首先查询在score_info表中有语文成绩的(即course_id为语文的course_id(需join连接course_info表获取))学生,接着在上面基础上,查询有成绩的课程数为3的学生,最后join连接student_info表输出学生id与name
结果:
总结归纳:
以上题主要考察了聚合函数使用,嵌套子查询,分组聚合,结果排序,join连接的使用等
知识补充:
1、在dataGrip中使用中文别名需要键盘左上角的反单引号(即波浪线下面的小点)
2、sum(if(a,b,c))即如果满足a条件则输出b(若b非空),否则输出c
3、
nvl(a,b),若a为空则判断b, nvl()与mysql中的 if not逻辑类似,可嵌套,有两个参数
coalesce(a,b,c...)相当于增强版的nvl函数,与nvl不同的是,coalesce可有多个参数