1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 《SQL高级应用和数据仓库基础(MySQL版)》作业v2 ·001【MySQL50题】

《SQL高级应用和数据仓库基础(MySQL版)》作业v2 ·001【MySQL50题】

时间:2023-03-23 09:25:53

相关推荐

《SQL高级应用和数据仓库基础(MySQL版)》作业v2 ·001【MySQL50题】

文章目录

一、数据准备1、数据表介绍2、数据引入二、问题与答案1.查询” 01 “课程比” 02 “课程成绩高的学生的信息及课程分数2.查询同时存在” 01 “课程和” 02 “课程的情况3.查询存在” 01 “课程但可能不存在” 02 “课程的情况(不存在时显示为 null)4.查询不存在” 01 “课程但存在” 02 “课程的情况5.查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩6.查询在 SC 表存在成绩的学生信息7.查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null)8.查询「李」姓老师的数量9.查询学过「张三」老师授课的同学的信息10.查询没有学全所有课程的同学的信息11.查询至少有一门课与学号为” 01 “的同学所学相同的同学的信息12.查询和” 01 “号的同学学习的课程 完全相同的其他同学的信息13.查询没学过”张三”老师讲授的任一门课程的学生姓名14.查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩15.检索” 01 “课程分数小于 60,按分数降序排列的学生信息16.按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩17.查询各科成绩最高分、最低分和平均分18.按各科平均成绩进行排序,并显示排名, Score 重复时保留名次空缺19.按各科平均成绩进行排序,并显示排名, Score 重复时不保留名次空缺20.查询学生的总成绩,并进行排名,总分重复时保留名次空缺21.查询学生的总成绩,并进行排名,总分重复时不保留名次空缺22.统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[60-0]及所占百分比23.查询各科成绩前三名的记录24.查询每门课程被选修的学生数25.查询出只选修两门课程的学生学号和姓名26.查询男生、女生人数27.查询名字中含有「风」字的学生信息28.查询同名同性学生名单,并统计同名人数29.查询 1990 年出生的学生名单30.查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列31.查询平均成绩大于等于 85 的所有学生的学号、姓名和平均成绩32.查询课程名称为「数学」,且分数低于 60 的学生姓名和分数33.查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况)34.查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数35.查询不及格的课程36.查询课程编号为 01 且课程成绩在 80 分以上的学生的学号和姓名37.求每门课程的学生人数38.成绩不重复,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩39.成绩有重复的情况下,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩40.查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩41.查询每门课程成绩最好的前两名42.统计每门课程的学生选修人数(超过 5 人的课程才统计)。43.检索至少选修两门课程的学生学号44.查询选修了全部课程的学生信息45.查询各学生的年龄,只按年份来算46.按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一47.查询本周过生日的学生48.查询下周过生日的学生49.查询本月过生日的学生50.查询下月过生日的学生

一、数据准备

1、数据表介绍

--1.学生表Student(SId,Sname,Sage,Ssex)--SId 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别--2.课程表Course(CId,Cname,TId)--CId 课程编号,Cname 课程名称,TId 教师编号--3.教师表Teacher(TId,Tname)--TId 教师编号,Tname 教师姓名--4.成绩表SC(SId,CId,score)--SId 学生编号,CId 课程编号,score 分数

2、数据引入

-- 学生表 Studentcreate table Student(SId varchar(10),Sname varchar(10),Sage datetime,Ssex varchar(10));insert into Student values('01' , '赵雷' , '1990-01-01' , '男');insert into Student values('02' , '钱电' , '1990-12-21' , '男');insert into Student values('03' , '孙风' , '1990-12-20' , '男');insert into Student values('04' , '李云' , '1990-12-06' , '男');insert into Student values('05' , '周梅' , '1991-12-01' , '女');insert into Student values('06' , '吴兰' , '1992-01-01' , '女');insert into Student values('07' , '郑竹' , '1989-01-01' , '女');insert into Student values('09' , '张三' , '-12-20' , '女');insert into Student values('10' , '李四' , '-12-25' , '女');insert into Student values('11' , '李四' , '-06-06' , '女');insert into Student values('12' , '赵六' , '-06-13' , '女');insert into Student values('13' , '孙七' , '-06-01' , '女');-- 科目表 Coursecreate table Course(CId varchar(10),Cname nvarchar(10),TId varchar(10));insert into Course values('01' , '语文' , '02');insert into Course values('02' , '数学' , '01');insert into Course values('03' , '英语' , '03');-- 教师表 Teachercreate table Teacher(TId varchar(10),Tname varchar(10));insert into Teacher values('01' , '张三');insert into Teacher values('02' , '李四');insert into Teacher values('03' , '王五');-- 成绩表 SCcreate table SC(SId varchar(10),CId varchar(10),score decimal(18,1));insert into SC values('01' , '01' , 80);insert into SC values('01' , '02' , 90);insert into SC values('01' , '03' , 99);insert into SC values('02' , '01' , 70);insert into SC values('02' , '02' , 60);insert into SC values('02' , '03' , 80);insert into SC values('03' , '01' , 80);insert into SC values('03' , '02' , 80);insert into SC values('03' , '03' , 80);insert into SC values('04' , '01' , 50);insert into SC values('04' , '02' , 30);insert into SC values('04' , '03' , 20);insert into SC values('05' , '01' , 76);insert into SC values('05' , '02' , 87);insert into SC values('06' , '01' , 31);insert into SC values('06' , '03' , 34);insert into SC values('07' , '02' , 89);insert into SC values('07' , '03' , 98);

二、问题与答案

1.查询” 01 “课程比” 02 “课程成绩高的学生的信息及课程分数

selectStudent.SId 学号, Sname 姓名, timestampdiff(YEAR, Sage, now()) 年龄, Ssex 性别,SCtmp.c1sc "课程01成绩", SCtmp.c2sc "课程02成绩"from Studentnatural join(selectc1.SId, c1.score c1sc,c2.score c2scfrom SC c1left join SC c2on c1.Sid = c2.Sidwhere c1.score > c2.scoreand c1.Cid = '01'and c2.Cid = '02') SCtmp;

2.查询同时存在” 01 “课程和” 02 “课程的情况

selectStudent.SId 学号, Sname 姓名, Ssex 性别,SCtmp.c1sc "课程01成绩", SCtmp.c2sc "课程02成绩"from Studentnatural join(selectc1.SId, c1.score c1sc,c2.score c2scfrom SC c1left join SC c2on c1.Sid = c2.Sidwhere c1.Cid = '01'and c2.Cid = '02') SCtmp;

3.查询存在” 01 “课程但可能不存在” 02 “课程的情况(不存在时显示为 null)

select c1.SId 学号, c1sc "课程01成绩", c2sc "课程02成绩"from(select SId, score c1sc from SC where CId = '01') c1left join (select SId, score c2sc from SC where CId = '02') c2on c1.SId = c2.SId;

4.查询不存在” 01 “课程但存在” 02 “课程的情况

select c2.SId 学号, c1sc "课程01成绩", c2sc "课程02成绩"from(select SId, score c1sc from SC where CId = '01') c1right join (select SId, score c2sc from SC where CId = '02') c2on c1.SId = c2.SId;

5.查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩

select SC.SId 学生编号, Sname 学生姓名, avg(score) 平均成绩from SCnatural join Studentgroup by SC.SIdhaving avg(score) >= 60;

6.查询在 SC 表存在成绩的学生信息

select Student.SId 学生编号, Sname 姓名, timestampdiff(YEAR, Sage, now()) 年龄, Ssex 性别from Studentnatural join (select SId from SC group by SId) tmp;

7.查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null)

select Student.SId 学生编号, Sname 学生姓名, count(score) 选课总数, sum(score) 总成绩from SCright join Studenton Student.SId = SC.SIdgroup by Student.SId;

8.查询「李」姓老师的数量

select count(*) 李姓老师数量from teacherwhere Tname like concat('李','%');

9.查询学过「张三」老师授课的同学的信息

selectStudent.SId 学号, Sname 姓名, timestampdiff(YEAR, Sage, now()) 年龄, Ssex 性别from Studentnatural join SCwhere SC.CId = (select CId from course natural join teacher where Tname = '张三');

10.查询没有学全所有课程的同学的信息

selectStudent.SId 学号, Sname 姓名, timestampdiff(YEAR, Sage, now()) 年龄, Ssex 性别from StudentwhereStudent.SId not in (select SIdfrom SCgroup by SIdhaving count(*) = (select count(*) from course));

11.查询至少有一门课与学号为” 01 “的同学所学相同的同学的信息

selectdistinct Student.SId 学号, Sname 姓名, timestampdiff(YEAR, Sage, now()) 年龄, Ssex 性别from Studentnatural join SCwhere CId in (select CId from SC where SId = '01');

12.查询和” 01 “号的同学学习的课程 完全相同的其他同学的信息

select Student.SId 学号, Sname 姓名, timestampdiff(YEAR, Sage, now()) 年龄, Ssex 性别from Studentnatural join SC sc1join (select SId, CId from SC where SId = '01') sc2on sc1.CId = sc2.CIdgroup by sc1.SIdhavingcount(*) = (select count(*) from SC sc3 where sc3.SId = sc1.SId) -- 连接查询后选课数等于原来选课数的and count(*) = (select count(*) from SC where SId = '01'); -- 并且选课数等于要选课相同的人的选课数

13.查询没学过”张三”老师讲授的任一门课程的学生姓名

select Sname 姓名from Studentwhere Sid not in(select distinct Sidfrom SCnatural join coursenatural join teacherwhere tname = '张三');

14.查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩

select Student.SId 学号, Sname 姓名, avg(score) 平均成绩from Studentnatural join SCwhere SId in(select SIdfrom SCwhere score < 60group by SIdhaving count(*) >= 2)group by SId;

15.检索” 01 “课程分数小于 60,按分数降序排列的学生信息

selectStudent.SId 学号, Sname 姓名, timestampdiff(YEAR, Sage, now()) 年龄, Ssex 性别,score "课程01分数"from Studentnatural join SCwhereCId = '01'and score < 60order by score desc;

16.按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩

select stu.SId 学生编号, Sname 学生姓名, avg(sc4.score) 平均成绩from Student stuleft join SC sc1onstu.SId = sc1.SIdand sc1.CId = '01'left join SC sc2onstu.SId = sc2.SIdand sc2.CId = '02'left join SC sc3onstu.SId = sc3.SIdand sc3.CId = '03'left join SC sc4on stu.SId = sc4.SIdgroup by stu.SIdorder by 3 desc;

17.查询各科成绩最高分、最低分和平均分

以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率 及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90

要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列

selectcourse.CId 课程号, Cname 课程名,max(score) 最高分, min(score) 最低分, avg(score) 平均分, count(*) 选修人数,sum(if(score >= 60, 1, 0)) / count(*) 及格率,sum(if(score >= 70 and score < 80, 1, 0)) / count(*) 中等率,sum(if(score >= 80 and score < 90, 1, 0)) / count(*) 优良率,sum(if(score >= 90, 1, 0)) / count(*) 优秀率from courseleft join SCon course.CId = SC.CIdgroup by course.CIdorder by 6 desc, 1 asc;

18.按各科平均成绩进行排序,并显示排名, Score 重复时保留名次空缺

selectCId 课程编号,avgsc 平均分,if(lastsc = thissc, rowid - (@count:=@count+1), rowid - @count:=0) 排名from(select CId, avgsc, @lagfield lastsc,@lagfield:=avgsc thissc, @id:=@id+1 rowidfrom(select CId, avg(score) avgsc from SC group by CId order by 2 desc) tmp,(select @lagfield:=0) r,(select @id:=0) rk) tmp2,(select @count:=0) cnt;

19.按各科平均成绩进行排序,并显示排名, Score 重复时不保留名次空缺

select CId 课程编号, avgsc 平均分, @id:=@id+1 排名from(select CId, avg(score) avgsc from SC group by CId order by 2 desc) tmp1,(select @id:=0) tmp2;

20.查询学生的总成绩,并进行排名,总分重复时保留名次空缺

selectSId 学生编号,sumsc 总分,if(lastsc = thissc, rowid - (@count:=@count+1), rowid - @count:=0) 排名from(select SId, sumsc, @lagfield lastsc,@lagfield:=sumsc thissc, @id:=@id+1 rowidfrom(select SId, sum(score) sumsc from SC group by SId order by 2 desc) tmp,(select @lagfield:=0) r,(select @id:=0) rk) tmp2,(select @count:=0) cnt;

21.查询学生的总成绩,并进行排名,总分重复时不保留名次空缺

select SId 课程编号, sumsc 平均分, @id:=@id+1 排名from(select SId, sum(score) sumsc from SC group by SId order by 2 desc) tmp1,(select @id:=0) tmp2;

22.统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[60-0]及所占百分比

selectcourse.CId 课程编号,Cname 课程名称,sum(if(score >= 85 and score <= 100, 1, 0)) "[85, 100]人数",sum(if(score >= 85 and score <= 100, 1, 0)) / count(*) "[85, 100]占比",sum(if(score >= 70 and score < 85, 1, 0)) "[70, 85)人数",sum(if(score >= 70 and score < 85, 1, 0)) / count(*) "[70, 85)占比",sum(if(score >= 60 and score < 70, 1, 0)) "[60, 70)人数",sum(if(score >= 60 and score < 70, 1, 0)) / count(*) "[60, 70)占比",sum(if(score >= 0 and score < 60, 1, 0)) "[0, 60)人数",sum(if(score >= 0 and score < 60, 1, 0)) / count(*) "[0, 60)占比"from courseleft join SCon course.CId = SC.CIdgroup by course.CId;

23.查询各科成绩前三名的记录

select CId 课程号, score 前三分数from((select CId, score from SC where CId = '01' order by score desc limit 3)union all(select CId, score from SC where CId = '02' order by score desc limit 3)union all(select CId, score from SC where CId = '03' order by score desc limit 3)) res;

24.查询每门课程被选修的学生数

select course.CId 课程号, Cname 课程名, count(SId) 选修人数from courseleft join SCon course.CId = SC.CIdgroup by course.CId;

25.查询出只选修两门课程的学生学号和姓名

select SC.SId 学号, Sname 姓名from SCnatural join Studentgroup by SC.SIdhaving count(*) = 2;

26.查询男生、女生人数

select Ssex 性别, count(*) 学生数from Studentgroup by Ssex;

27.查询名字中含有「风」字的学生信息

select SId 学号, Sname 姓名, timestampdiff(YEAR, Sage, now()) 年龄, Ssex 性别from Studentwhere Sname like concat('%', '风', '%');

28.查询同名同性学生名单,并统计同名人数

select s1.Sname 姓名, s1.Ssex 性别, count(*) 同名人数from Student s1join Student s2ons1.SId != s2.SIdand s1.Sname = s2.Snameand s1.Ssex = s2.Ssexgroup by s1.Sname, s1.Ssex;

29.查询 1990 年出生的学生名单

select SId 学号, Sname 姓名, timestampdiff(YEAR, Sage, now()) 年龄, Ssex 性别from Studentwhere Year(Sage) = 1990;

30.查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列

select SC.CId 课程号, Cname 课程名, avg(score) 平均分from SCnatural join coursegroup by SC.CIdorder by 3 desc, 1 asc;

31.查询平均成绩大于等于 85 的所有学生的学号、姓名和平均成绩

select SC.SId 学号, Sname 姓名, avg(score)from SCnatural join Studentgroup by SC.SIdhaving avg(score) >= 85order by 3 desc;

32.查询课程名称为「数学」,且分数低于 60 的学生姓名和分数

select Sname, scorefrom SCnatural join Studentnatural join coursewhereCname = '数学'and score < 60;

33.查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况)

selectstu.SId 学号, Sname 姓名,sc1.score 语文, sc2.score 数学, sc3.score 英语from Student stuleft join SC sc1onstu.SId = sc1.SIdand sc1.CId = '01'left join SC sc2onstu.SId = sc2.SIdand sc2.CId = '02'left join SC sc3onstu.SId = sc3.SIdand sc3.CId = '03'order by 1;

34.查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数

select SC.SId 学号, Sname 姓名, Cname 课程名, score 分数from SCnatural join Studentnatural join coursewhere score >= 70;

35.查询不及格的课程

select SC.SId 学号, Sname 姓名, Cname 课程名, score 分数from SCnatural join Studentnatural join coursewhere score < 60;

36.查询课程编号为 01 且课程成绩在 80 分以上的学生的学号和姓名

select SC.SId 学号, Sname 姓名from SCnatural join StudentwhereCId = '01'and score >= 80;

37.求每门课程的学生人数

select course.CId 课程号, Cname 课程名, count(SId) 选修人数from courseleft join SCon course.CId = SC.CIdgroup by course.CId;

38.成绩不重复,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩

select SC.SId 学号, Sname 姓名, score 成绩from SCnatural join Studentnatural join Teachernatural join coursewhere Tname = '张三'order by score desclimit 1;

39.成绩有重复的情况下,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩

select SC.SId 学号, Sname 姓名, score 成绩from SCnatural join Studentnatural join Teachernatural join coursewhereTname = '张三'and score = (select max(score)from SCnatural join Teachernatural join coursewhere Tname = '张三'group by SC.CId);

40.查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩

select distinct sc1.SId 学号, sc1.CId 课程号, sc1.score 学生成绩from SC sc1join SC sc2onsc1.CId != sc2.CIdand sc1.score = sc2.score;

41.查询每门课程成绩最好的前两名

select CId 课程号, Sname 前二姓名, score 前二成绩from Studentnatural join((select SId, CId, score from SC where CId = '01' order by score desc limit 2)union(select SId, CId, score from SC where CId = '02' order by score desc limit 2)union(select SId, CId, score from SC where CId = '03' order by score desc limit 2)) tmporder by 1 asc, 3 desc;

42.统计每门课程的学生选修人数(超过 5 人的课程才统计)。

select course.CId 课程号, Cname 课程名, count(SId) 选修人数from courseleft join SCon course.CId = SC.CIdgroup by course.CIdhaving count(SId) > 5;

43.检索至少选修两门课程的学生学号

select SC.SId 学号from SCnatural join Studentgroup by SC.SIdhaving count(*) >= 2;

44.查询选修了全部课程的学生信息

selectStudent.SId 学号, Sname 姓名, timestampdiff(YEAR, Sage, now()) 年龄, Ssex 性别from StudentwhereStudent.SId in (select SIdfrom SCgroup by SIdhaving count(*) = (select count(*) from course));

45.查询各学生的年龄,只按年份来算

selectSId 学号, Sname 姓名, year(now()) - year(Sage) 年龄, Ssex 性别from Student;

46.按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一

selectSId 学号, Sname 姓名, timestampdiff(YEAR, Sage, now()) 年龄, Ssex 性别from Student;

47.查询本周过生日的学生

select SId 学号, Sname 姓名from Studentwhere (weekofyear(date_format(Sage, concat(year(now()), '-%m-%d'))) = weekofyear(now()));

48.查询下周过生日的学生

select SId 学号, Sname 姓名from Studentwhere (weekofyear(date_format(Sage, concat(year(now()), '-%m-%d'))) = weekofyear(date_sub(now(), interval 1 week)));

49.查询本月过生日的学生

select SId 学号, Sname 姓名from Studentwhere (month(Sage) = month(now()));

50.查询下月过生日的学生

select SId 学号, Sname 姓名from Studentwhere (month(Sage) = month(date_sub(now(), interval 1 month)));

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。