实验八
声明:所有SQL语句均在实验平台验证通过,实验细节可能随时间推移老师会进行修改。在此仅提供解答思路,毕竟我的方法肯定不是最优,而且实验平台有查重功能,不要一昧的复制哦!
1.查询各院系(不包括院系名称为空的)的数据结构平均成绩avg_ds_score、操作系统平均成绩avg_os_score,平均成绩四舍五入到个位,创建表test8_01。
create table test8_01 as select ds.dname,ds.avg_ds_score,os.avg_os_score from
(select dname,round(avg(score),0) avg_ds_score from
(select * from
(select sid,max(score) score from pub.student_course where cid in
(select cid from pub.course where name='数据结构') group by sid) sc join
(select dname,sid from pub.student) s on sc.sid=s.sid where dname is not null)
group by dname) ds
join
(select dname,round(avg(score),0) avg_os_score from
(select * from
(select sid,max(score) score from pub.student_course where cid in
(select cid from pub.course where name='操作系统') group by sid) sc join
(select dname,sid from pub.student) s on sc.sid=s.sid where dname is not null)
group by dname) os on ds.dname=os.dname;
2.查询”计算机科学与技术学院”的同时选修了数据结构、操作系统两门课的学生的学号sid、姓名name、院系名称dname、数据结构成绩ds_score、操作系统成绩os_score,创建表test8_02。
create table test8_02 as
select s.sid,s.name,s.dname,ds_score,os_score from
((select sid,max(score) ds_score from pub.student_course where cid in
(select cid from pub.course where name='数据结构') and
sid in (select sid from pub.student where dname='计算机科学与技术学院') group by sid) ds
join
(select sid,max(score) os_score from pub.student_course where cid in
(select cid from pub.course where name='操作系统') and
sid in (select sid from pub.student where dname='计算机科学与技术学院') group by sid) os
on ds.sid=os.sid
left join pub.student s on os.sid=s.sid);
3.查询计算机科学与技术学院的选修了数据结构或者操作系统的学生的学号sid、姓名name、院系名称dname、数据结构成绩ds_score、操作系统成绩os_score,创建表test8_03。
create table test8_03 as
select distinct a.sid,a.name,a.dname,ds_score,os_score from
(select distinct s.sid,s.name,s.dname,ds_score from
(select * from pub.student where dname='计算机科学与技术学院' and sid in
(select sid from pub.student_course where cid in (select cid from pub.course where name='数据结构' or name='操作系统'))
) s
left join
(select sid,max(score) ds_score from pub.student_course where cid in
(select cid from pub.course where name='数据结构') and
sid in (select sid from pub.student where dname='计算机科学与技术学院') group by sid) ds on s.sid=ds.sid) a
left join
(select sid,max(score) os_score from pub.student_course where cid in
(select cid from pub.course where name='操作系统') and
sid in (select sid from pub.student where dname='计算机科学与技术学院') group by sid) os on a.sid=os.sid;
4.查询计算机科学与技术学院所有学生的学号sid、姓名name、院系名称dname、数据结构成绩ds_score、操作系统成绩os_score,创建表test8_04。
create table test8_04 as
select distinct a.sid,a.name,a.dname,ds_score,os_score from
(select distinct s.sid,s.name,s.dname,ds_score from
(select * from pub.student where dname='计算机科学与技术学院' ) s
left join
(select sid,max(score) ds_score from pub.student_course where cid in
(select cid from pub.course where name='数据结构') and
sid in (select sid from pub.student where dname='计算机科学与技术学院') group by sid) ds on s.sid=ds.sid) a
left join
(select sid,max(score) os_score from pub.student_course where cid in
(select cid from pub.course where name='操作系统') and
sid in (select sid from pub.student where dname='计算机科学与技术学院') group by sid) os on a.sid=os.sid;
笔记:
1.第一小题先筛选出每个学生这两门课的成绩,然后按学院分组求平均。
2.第二小题分别查询计算机科学与技术学院选修了数据结构和操作系统的同学,然后两个做连接,最后只保留同时选修了两门课的同学。
3.第三,第四小题与第二小题类似,但是根据题目的细微变化,要采用不同的连接方法。
4.而且对于2个表以上的连接,我建议把连接后的表定义为一个新的表,再和第三个表做连接,否则可能结果会出现很多null的空连接,这是我测试多遍得出的。
ps:本人开通了个人的微信公众号,希望大家能关注一下,
我会将资源、文章优先推送到公众号上。
推送自己的一些学习笔记,实验源代码等,
欢迎大家互相交流学习。