SQL练习

学生表: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;
相关文章
相关标签/搜索