学生表:STUDENT(S#,SNAME,SAGE,SSEX)数据库
教师表:TEACHER(T#,TNAME)c#
课程表:COURSE(C#,CNAME,T#)code
成绩表:SC(S#,C#,SCORE)select
--一、查询课程编号为“001”的课程比“002”的课程成绩高的全部学生的学号 select A.s# from (select * from A_sc where c# = '001') A inner join (select * from A_sc where c# = '002') B on A.s# = B.s# where A.score > B.score;
--三、查询全部学生的学号、姓名、选课数、总成绩 select A.s#, A.sname, nvl(B.c, 0), nvl(B.s, 0) from A_student A left join (select s#, count(*) c, sum(score) s from A_sc group by s#) B on A.s# = B.s#; SELECT A_STUDENT.S#, A_STUDENT.SNAME, COUNT(A_SC.C#), nvl(SUM(SCORE),0) FROM A_STUDENT LEFT OUTER JOIN A_SC ON A_STUDENT.S#=A_SC.S# GROUP BY A_STUDENT.S#, SNAME;
--五、查询没学过“李美玲”老师课的学生的学号、姓名 select s#,sname from A_student D where s# not in (select s# from A_SC A inner join A_course B on A.c# = B.c# inner join A_teacher C on B.t# = C.t# where C.tname = '李美玲');
--六、查询学过编号为“001”的课程而且也学过编号为“002”的课程的学生的学号、姓名 select A.s#, A.sname from A_student A inner join (select s# from A_sc where c# = '001') B on A.s# = B.s# inner join (select s# from A_sc where c# = '002') C on A.s# = C.s#;
--七、查询学过“李美玲”老师所教的全部课的学生的学号、姓名, select C.s#, D.sname from ( select s#, c# from A_sc where c# in (select c# from A_course A inner join A_teacher B on A.t# = B.t# where B.tname = '李美玲')) C inner join A_student D on C.s# = D.s# group by C.s#, D.sname having count(*) = (select count(*) from A_course A inner join A_teacher B on A.t# = B.t# where B.tname = '李美玲'); --要求 老师名字惟一
--九、查询全部课程成绩小于90分的学生的学号、姓名 select A.s#, A.sname from A_student A inner join (select s#, count(*) c from A_sc group by s#) B on A.s# = B.s# inner join (select s#, count(*) c from A_sc where score < 90 group by s#) C on A.s# = C.s# where B.c = C.c; select s#,sname from A_student where s# not in (select s# from A_sc where score >= 90);
--十、查询没有学全全部课的学生的学号、姓名 select s#,sname from A_student where s# not in (select s# from A_sc group by s# having count(*) = (select count(*) from A_course)); select A.s#, A.sname from A_student A inner join A_sc B on A.s# = B.s# group by A.s#,A.sname having count(B.c#) < (select count(*) from A_course);
--十一、查询至少有一门课与学号为“2018001”的学生所学课程相同的学生的学号和姓名 select distinct A.s#,sname from A_student A inner join A_sc B on A.s# = B.s# where c# in (select c# from A_sc where s# = '2018001');
--十二、查询所学课程和学号为“2018002”的学生全部课程同样的其余学生的学号和姓名 select A.s#,sname from A_student A inner join A_sc B on A.s# = B.s# where c# in (select c# from A_sc where s# = '2018002') group by A.s#,sname having count(*) = (select count(*) from A_sc where s# = '2018002');
结果:2018002李四学的课程,张三都学了,且张三有其余课程,李四没有学,取的子集,且包含自己。im
--1八、查询各科成绩最高和最低的分 select c#,max(score),min(score) from A_sc group by c# order by c#;
--1九、按各科平均成绩从低到高和及格率的百分数从高到低排列,以以下形式显示:课程号|课程名|平均成绩|及格百分数 select A.c#, cname, round(avg(score), 2), round(sum(case when score >= 60 then 1 else 0 end)/count(*) * 100)||'%' from A_course A inner join A_sc B on A.c# = B.c# group by A.c#,cname order by avg(score), sum(case when score >= 60 then 1 else 0 end)/count(*) desc;
--20、查询以下课程平均成绩和及格率的百分数(用1行显示),其中企业管理为001,马克思为002,UML为003,数据库为004 select round(sum(case c# when '001' then score else 0 end)/sum(case c# when '001' then 1 else 0 end), 2) 企业管理平均分, round(sum(case when c#='001' and score>60 then 1 else 0 end)/sum(case c# when '001' then 1 else 0 end)*100, 2)||'%' 企业管理及格率, sum(case c# when '002' then score else 0 end)/sum(case c# when '002' then 1 else 0 end) 马克思平均分, sum(case c# when '004' then score else 0 end)/sum(case c# when '004' then 1 else 0 end) 数据库平均分 from A_sc;
--2一、查询不一样老师所教不一样课程平均分从高到低显示 select B.c#,B.cname,round(avg(score)),C.t#,C.tname from A_sc A inner join A_course B on A.c# = B.c# inner join A_teacher C on B.t# = C.t# group by B.c#,B.cname,C.t#,C.tname order by avg(score) desc;