sql多表练习24.10.31

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

猜你喜欢

转载自blog.csdn.net/qq_42217078/article/details/143402411