文章目录
一、数据准备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)));