#自测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;
  









