#自测sql的考试题
#------------------创建表结构-------------------------
#学生表
drop table if exists S;
create table S(Sid int(1),SNAME char(20),AGE int(1),SEX int(1));
#成绩表
drop table if exists SC;
create table SC(Sid int(1),Cid char(5),GRADE int(20));
#课程表
drop table if exists C;
create table C(Cid char(5),CNAME char(20),TEACHER char(20));
#------------------插入数据-------------------------------
insert into S(Sid,SNAME,AGE,SEX)values(1111,'David',28,1);
insert into S(Sid,SNAME,AGE,SEX)values(1112,'Dany',23,0);
insert into S(Sid,SNAME,AGE,SEX)values(1113,'TOM',38,1);
insert into S(Sid,SNAME,AGE,SEX)values(1114,'Lily',20,0);
insert into SC(Sid,Cid,GRADE)values(1113,'C1','38');
insert into SC(Sid,Cid,GRADE)values(1112,'C2','80');
insert into SC(Sid, Cid,GRADE)values(1112,'C3','67');
insert into SC(Sid,Cid,GRADE)values(1111,'C4','88');
insert into SC(Sid,Cid,GRADE)values(1114,'C4','66');
insert into C(Cid,CNAME,TEACHER)values('C4','Maths','zhangsan');
insert into C(Cid,CNAME,TEACHER)values('C3','English','lisi');
insert into C(Cid,CNAME,TEACHER)values('C2','Chinese','wangwu');
insert into C(Cid,CNAME,TEACHER)values('C1','Computer','zhaoliu');
show tables;
#--------------------------------------------
select * from s ; #学生表
select * from sc; #成绩表
select * from c; #课程表
#-----------------具体问题------------------------
#1.查询出学习成绩及格以上的学生姓名与成绩
select s.SNAME 学生姓名,sc.grade 学生成绩
from s
left join sc
on s.Sid = sc.sid
where sc.grade >= 60
#2.查询姓名以ny结尾的学生姓名及其任课老师姓名
select s.sname 学生姓名,c.teacher 老师姓名
from s
join sc
on s.sid = sc.sid
join c
on sc.cid = c.cid
where s.sname like "%ny"
#3.选修课名为Maths的学生学号与姓名
select s.sid 学生学号, s.sname 学生姓名
from s
join sc
on s.sid = sc.sid
join c
on sc.cid = c.cid
where c.cname = "maths"
#4.选修课号为C2和C4的学生学号
select sid 学号 from sc
where cid in ('c2','c4')
#5.请问没有参加考试的学生的姓名及其学号
select s.sname 学生姓名,s.sid 学号 from s
left join sc on s.sid = sc.sid
where grade is null;
#6.请问总分在80分以上的学生姓名
select s.sname 学生姓名 from s
left join sc on s.sid = sc.sid
group by s.sname having sum(sc.grade) > 80
#7.请问考试不及格的考生姓名以及科目名称
select s.sname 学生姓名,c.cname 科目名称 from s
left join sc
on s.sid = sc.sid
left join c
on sc.cid = c.cid
where sc.grade <60;
#8.显示出参加考试的学生的学号和姓名
select s.sid,s.sname from s
left join sc
on s.sid = sc.sid
where sc.grade is not null
#9.请问TOM参加了哪一门科目的考试
select c.cname 考试科目 from c
left join sc
on c.cid = sc.cid
left join s
on s.sid = sc.sid
where s.sname = "tom";
#10.找出Dany的所有考试后成绩中最高的科目的任课老师姓名
select c.teacher 任课老师 from c
left join sc
on c.cid = sc.cid
left join s
on s.sid = sc.sid
where s.sname = "dany" and (sc.sid,sc.grade) in (select sid,max(grade) grade from sc group by sid ) ;
#11.找出各科分数最高的学生的任课老师
#----方法1------
select c.teacher
from
(select sc.cid 学科号 ,max(sc.grade) 最高成绩
from sc group by cid ) a
left join c
on a.学科号 = c.cid
#----方法2------
select
a.teacher 任课老师
from
(select
row_number() over(partition by cid order by cid ,grade desc ) as pm,
s.sname,sc.cid ,sc.grade ,c.teacher from c
left join sc on c.cid = sc.cid
left join s on s.sid = sc.sid ) a
where a.pm = 1;