头歌MySQL——复杂查询
目录
第1关:体育馆的人流量
第2关:统计总成绩
第3关:查询学生平均分
第4关:查询修课相同学生信息
第5关:查询各科成绩并排序
第6关:查询张老师课程成绩最高的学生信息
第7关:查询两门课程不及格同学信
第1关:体育馆的人流量
任务描述
本关任务:某市建了一个新的体育馆,每日人流量信息被记录在gymnasium表中:序号 (id)、日期 (date)、 人流量 (visitors_flow)。请编写一个查询语句,找出人流量的高峰期。高峰期时,至少连续三行记录中的人流量不少于100。
gymnasium表结构数据如下:
提示:每天只有一行记录,日期随着 id 的增加而增加。
预期输出:

#请在此添加实现代码
select distinct a.* from gymnasium as a,gymnasium as b,gymnasium as c
where(a.visitors_flow>=100 and b.visitors_flow>=100 and c.visitors_flow>=100)
and((a.id=b.id-1 and b.id=c.id-1)or(a.id=b.id-1 and a.id=c.id+1)or(a.id=b.id+1 and b.id=c.id+1)
)order by id;
第2关:统计总成绩
任务描述
本关任务:计算每个班的语文总成绩和数学总成绩,要求科目中低于60分的成绩不记录总成绩。
tb_score结构数据: tb_class表结构数据:

预期输出

#请在此添加实现代码
select t1.classname,t1.chinese,t2.maths
from(select c.classname as classname,sum(s.chinese) as chinese from tb_class c,tb_score swhere c.stuname=s.name and s.chinese>=60 group by c.classname) t1,
(select c.classname as classname,sum(s.maths) as maths from tb_class c, tb_score swhere c.stuname=s.name and s.maths>=60 group by c.classname) t2
where t1.classname=t2.classname;
第3关:查询学生平均分
任务描述
本关任务:根据提供的表和数据,查询平均成绩小于60分的同学的学生编号(s_id)、学生姓名(s_name)和平均成绩(avg_score),要求平均成绩保留2位小数点。(注意:包括有成绩的和无成绩的)

student表数据: score表部分数据:

teacher表数据: course表数据:
预期输出:

#请在此添加实现代码
select b.s_id,b.s_name,round(avg(a.s_score),2) as avg_score from student b inner join score a on b.s_id=a.s_idgroup by b.s_id,b.s_name having avg_score <=60
union
select a.s_id,a.s_name,0 as avg_score from student awhere a.s_id not in (select distinct s_id from score);
第4关:查询修课相同学生信息
任务描述
本关任务:根据提供的表和数据,查询与s_id=01号同学学习的课程完全相同的其他同学的信息(学号s_id,姓名s_name,性别s_sex)。表格数据与第三关一致。
预期输出:

#请在此添加实现代码
select s.s_id,s.s_name,s.s_sex
from student s
where s.s_id!="01"
and not exists(select c_id from score where s_id="01"and c_id not in(select c_id from score where s_id=s.s_id)
)
and not exists(select c_id from score where s_id=s.s_idand c_id not in(select c_id from score where s_id="01")
);
第5关:查询各科成绩并排序
任务描述
本关任务:根据提供的表和数据,查询各科成绩,进行排序并显示排名,按学生编号(s_id)、课程编号(c_id)、学生成绩(s_score)和排名(rank)进行输出,表格数据与第三关一致。
#请在此添加实现代码
select a.s_id,a.c_id,a.s_score,count(b.s_score)+1 rank
from score a left join score b
on a.c_id=b.c_id and a.s_score<b.s_score
group by a.s_id,a.c_id,a.s_score
order by a.c_id,a.s_score desc,count(b.s_score),a.s_id desc;
第6关:查询张老师课程成绩最高的学生信息
任务描述
本关任务:根据提供的表和数据,查询选修“张三”老师所授课程的学生中,成绩最高的学生信息(具体输出信息请查看测试说明)及其成绩。表格数据与第三关一致。
预期输出:

#请在此添加实现代码
select a.*,b.s_score,b.c_id,c.c_name from student a
inner join score b on a.s_id=b.s_id
inner join course c on b.c_id=c.c_id
where b.c_id=(select c_id from course c,teacher dwhere c.t_id=d.t_id and d.t_name="张三")
and b.s_score in (select max(s_score)from score where c_id="02");
第7关:查询两门课程不及格同学信息
任务描述
本关任务:根据提供的表和数据,查询两门及其以上不及格课程的同学的学号(s_id)、姓名(s_name)及其平均成绩(avg_score),要求计算平均成绩后为整数。表格数据与第三关一致。
预期输出:

#请在此添加实现代码
select a.s_id,a.s_name,round(avg(b.s_score))avg_score
from student a
inner join score b on a.s_id=b.s_id
where a.s_id in (select s_id from score where s_score<60
group by s_id having count(*)>=2)
group by a.s_id,a.s_name;
