sql综合练习题
一、表关系 年级表:class_grade create table class_grade( gid int primary key auto_increment, gname varchar(20) not null ); insert into class_grade(gname) values ('一年级'), ('二年级'), ('三年级'); 班级表:class create table class( cid int primary key auto_increment, caption varchar(30) not null, grade_id int not null, constraint class_name foreign key(grade_id) references class_grade(gid) on delete cascade on update cascade ); insert into class(caption,grade_id) values ('一年一班',1), ('二年一班',2), ('三年二班',3); 学生表:student create table student( sid int primary key auto_increment, sname varchar(20) not null, gender enum('女','男'), class_id int not null, constraint student_name foreign key(class_id) references class(cid) on delete cascade on update cascade ); insert into student(sname,gender,class_id) values ('乔丹','女',1), ('艾弗森','女',1), ('科比','女',2); 老师表:teacher create table teacher( tid int primary key auto_increment, tname varchar(30) not null ); insert into teacher(tname) values ('张三'), ('李四'), ('王五'); 课程表:course create table course( cid int primary key auto_increment, cname varchar(30) not null, teacher_id int not null, constraint teacher_name foreign key(teacher_id) references teacher(tid) on delete cascade on update cascade ); insert into course(cname,teacher_id) values ('生物',1), ('体育',1), ('物理',2); 成绩表:score create table score( sid int primary key auto_increment, student_id int not null, course_id int not null, score int not null, foreign key(student_id) references student(sid) on delete cascade on update cascade, foreign key(course_id) references course(cid) on delete cascade on update cascade ); insert into score(student_id,course_id,score) values (1,1,60), (1,2,59), (2,2,99); 班级任职表:teach2cls create table teach2cls( tcid int primary key auto_increment, tid int not null, cid int not null, foreign key(tid) references teacher(tid) on delete cascade on update cascade, foreign key(cid) references class(cid) on delete cascade on update cascade ); insert into teach2cls(tid,cid) values (1,1), (1,2), (2,1), (3,2); 2、查询学生总人数 select count(sname) 总人数 from student; 3、查询’生物‘课程和’物理‘课程成绩都及格的学生id和姓名 select sid, sname from student inner join ( select student_id from score where course_id in ( select cid from course where cname in ('生物','物理') ) and score >= 60 ) as t1 on t1.student_id = student.sid; 4、查询每个年级的班级数,取出班级数最多的前三个年级; select class_grade.gid, class_grade.gname from class_grade inner join ( select grade_id, count(cid) from class group by grade_id order by grade_id desc limit 3 ) as t1 on t1.grade_id = class_grade.gid; 5、查询平均成绩最高和最低的学生的id和姓名以及平均成绩; select student.sid, student.sname, avg_score from student inner join( select student_id, avg(score) as avg_score from score group by student_id having avg(score) in ( ( select avg(score) as max_score from score group by student_id order by avg(score) desc limit 1 ), ( select avg(score) as min_score from score group by student_id order by avg(score) limit 1 ) ) ) as t1 on t1.student_id = student.sid; 6、查询每个年级的学生人数 select class_grade.gname, count_cid from class_grade inner join ( select grade_id, count(cid) as count_cid from class,student where class.cid = class_id group by grade_id ) as t1 on t1.grade_id = class_grade.gid; 7、查询每位学生的学号、姓名、选课数、平均成绩; select student.sid, student.sname, course_count, avg_score from student left join ( select student_id, count(course_id) as course_count, avg(score) as avg_score from score group by student_id ) as t1 on t1.student_id = student.sid; 8、查询学生编号为‘2’的学生的姓名,该学生成绩最高的课程名、成绩最低的课程名及分数; select student.sname, student.sid, t1.score from ( select student_id, course_id, score from score where student_id = 2 and score in ( ( select max(score) from score where student_id = 2), ( select min(score) from score where student_id =2) ) )as t1 inner join student on t1.student_id = student.sid inner join course on t1.course_id = course.cid; 9、查询‘李’的老师的个数和所带班级数; select count(teacher.tname) as '李%个数', count(teach2cls.cid) as '班级数量' from teacher left join teach2cls on teach2cls.tid = teacher.tid where teacher.tname like '李%'; 10、查询班级数小于5年级的id和年级名; select gid, gname, count(cid) from class_grade inner join class on gid = grade_id group by gid having count(cid) < 5 11、查询班级信息,包括班级id、班级名称、年级、年级级别(12 为低年级,34为中年级,56为高年级) select class.cid as '班级id', class.caption as '班级名称', class_grade.gid as '年级', case when class_grade.gid between 1 and 2 then '低' when class_grade.gid between 3 and 4 then '中' when class_grade.gid between 5 and 6 then '高' else 0 end as '年级级别' from class left join class_grade on class_grade.gid=class.grade_id; 12、查询学过“张三”老师2门课以上的同学的学号、姓名; select sid, sname from student where sid in ( select student_id from score left join course on course_id = course.cid where course.teacher_id in ( select tid from teacher where tname = '张三' ) group by student_id having count(course.cid)>=2 ) 13、查询教授课程超过2门的老师的id和姓名; select tid, tname from teacher inner join ( select teacher_id, count(cid) from course group by teacher_id having count(cid) >=2 ) as t1 on t1.teacher_id = teacher.tid; 14、查询学过编号‘1’课程和编号2课程的同学的学号、姓名; select sid, sname from student where sid in ( select course_id from score group by course_id having course_id in (1,2) ) 15、查询没有带过高年级的老师id和姓名; select tid, tname from teacher where tid in ( select tid from teach2cls where tid in (select cid from class where grade_id in (5,6))); 16、查询学过'张三'老师所教的所有课的同学的学号、姓名; select sid, sname from student where sid in ( select student_id from score where course_id in ( select cid from course inner join teacher on teacher_id = teacher.tid where teacher.tname ='张三')); 17、查询带过超过2个班级的老师的id和姓名; select tid, tname from teacher where tid in ( select tid from teach2cls group by tid having count(cid) >2); 18、查询课程编号’2‘的成绩比课程’1‘课程低的所有同学的学号、姓名 select sid, sname from student where sid in ( select t1.student_id from ( select student_id, score from score where course_id =2 ) as t1 inner join ( select student_id, score from score where course_id =1 ) as t2 on t1.student_id = t2.student_id where t1.score < t2.score); 19、查询所带班级数最多的老师id和姓名; select tid, tname from teacher where tid = (select tid from teach2cls group by tid order by count(cid) desc limit 1); 20、查询有课程成绩小于60分的同学的学号、姓名; select sid, sname from student where sid in ( select student_id from score where score <60); 21、查询没有学全所有课的同学的学号、姓名; select sid, sname from student where sid not in ( select student_id from score group by student_id having count(course_id) = (select count(cid) from course)); 22、查询至少有一门课与学号为“1”的同学所学相同的同学的学号和姓名; select sid, sname from student where sid in ( select student_id from score where course_id in (select course_id from score where student_id = 1)); 23、查询至少学过学号为“1”同学所选课程中任意一门课的其他同学学号和姓名; select sid, sname from student where sid in ( select student_id from score where course_id in (select course_id from score where student_id = 1) having student_id !=1 ); 24、查询和‘2’号同学学习的课程完全相同的其它同学的学号和姓名 select sid, sname from student where sid in ( select student_id from score,( select course_id from score where student_id = 2) as t1 where score.course_id = t1.course_id and score.student_id !=2 group by score.student_id having count(score.course_id)= ( select count(course_id) from score where student_id =2 ) ); 25、删除学习‘张三’老师课的score表记录; delete from score where course_id in ( select cid from course where course.teacher_id = ( select tid from teacher where teacher.tname = '张三')); 26、向score表中插入一些记录,这些记录要求符合以下条件: 1、没有上过编号‘2’课程的同学学号 2、插入’2‘号课程的平均成绩 insert into score(student_id,course_id,score) select t1.sid,2,t2.avg from ( select sid from student where sid not in ( select student_id from score where course_id = 2)) as t1, (select avg(score) as avg from score group by course_id having course_id =2) as t2; 27、按平均成绩从低到高显示所有学生的“语文”、“数学”、“英语”三门的课程成绩, 按如下形式显示: 学生ID,语文,数学,英语,有效课程数,有效平均分; select sc.student_id as 学生ID, (select score.score from score left join course on score.course_id = course.cid where course.cname = '生物' and score.student_id = sc.student_id) as 生物, (select score.score from score left join course on score.course_id = course.cid where course.cname = '体育' and score.student_id = sc.student_id) as 体育, (select score.score from score left join course on score.course_id = course.cid where course.cname = '物理' and score.student_id = sc.student_id) as 物理, count(sc.course_id) as '有效课程数',avg(sc.score) as '有效平均分' from score as sc group by sc.student_id order by avg(sc.score); 28、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,高低分; select course_id as "课程ID",max(score) as "最高分",min(score) as "最低分" from score group by course_id 29、按各科平均成绩从低到高和及格率的百分数从高到低顺序; SELECT course_id as '课程ID',AVG(score) as '平均成绩', sum(CASE WHEN score > 60 then 1 ELSE 0 END)/COUNT(1)*100 as '及格率' from score GROUP BY course_id ORDER BY '平均成绩' ASC,'及格率' desc; 30、课程平均分从高到低显示(现实任课老师); SELECT score.course_id as '课程ID',avg(score) as '平均分' from score inner join course on score.course_id = course.cid GROUP BY course_id ORDER BY avg(score) DESC 31、查询各科成绩前三名的记录(不考虑成绩并列情况) SELECT score.sid,score.course_id,score.score,t1.first_score,t1.sencond_score,t1.third_score from score LEFT JOIN (SELECT sid, (select score from score as s2 where s2.course_id=s1.course_id ORDER BY score desc LIMIT 0,1) as first_score, (select score from score as s2 where s2.course_id=s1.course_id ORDER BY score desc LIMIT 1,1) as sencond_score, (select score from score as s2 where s2.course_id=s1.course_id ORDER BY score desc LIMIT 2,1) as third_score from score as s1)as t1 on score.sid = t1.sid WHERE score.score in (t1.first_score,t1.sencond_score,t1.third_score) 32、查询每门课程被选修的学生数; SELECT score.course_id as '课程ID',count(student_id) as '学生数' from score GROUP BY course_id 33、查询选修了2门以上课程的全部学生的学号和姓名; SELECT student.sid,student.sname from student WHERE sid in ( SELECT score.student_id from score GROUP BY student_id HAVING count(course_id) >=2); 34、查询男生、女生的人数,按倒序排列; select gender,count(sid) as sum from student group by gender order by sum desc 35、查询姓“张”的学生名单; SELECT sname from student WHERE sname like '张%' 36、查询同名同姓学生名单,并统计同名人数; SELECT sname as '名字',count(sname) as '同名人数' from student GROUP BY sname HAVING count(sname) >1 37、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列; select score.course_id,avg(score) as avg from score INNER JOIN course on course.cid = course_id GROUP BY course_id ORDER BY avg ASC,course_id DESC; 38、查询课程名称为“数学”,且分数低于60的学生姓名和分数; SELECT sid,sname from student where sid in ( SELECT score.student_id from score INNER JOIN course on course.cid = score.course_id WHERE course.cname = '体育' and score.score <60); 39、查询课程编号为“3”且课程成绩在80分以上的学生的学号和姓名; SELECT sid,sname from student WHERE sid in ( SELECT score.student_id from score INNER JOIN course on course.cid = course_id WHERE course_id = 3 and score.score > 80); 40、求选修了课程的学生人数 select course_id as '课程ID',count(student_id) as '学生人数' from score group by course_id; 41、查询选修“王五”老师所授课程的学生中,成绩最高和最低的学生姓名及其成绩; SELECT student.sname,max(score),min(score) from score INNER JOIN student on score.student_id = student.sid WHERE course_id in ( SELECT cid from course WHERE teacher_id in ( SELECT tid FROM teacher WHERE tname = '王五')) GROUP BY student_id ORDER BY max(score) DESC,MIN(score) ASC LIMIT 2 42、查询各个课程及相应的选修人数; SELECT score.course_id as 'ID',course.cname as '课程',count(student_id) as '人数' from score LEFT JOIN course on score.course_id = course.cid GROUP BY course_id 43、查询不同课程但成绩相同的学生的学号、课程号、学生成绩; select DISTINCT s1.course_id,s2.course_id,s1.score,s2.score from score as s1, score as s2 where s1.score = s2.score and s1.course_id != s2.course_id; 44、查询每门课程成绩最好的前两名学生id和姓名; SELECT score.sid,score.course_id,score.score,t1.first_score,t1.sencond_score from score LEFT JOIN (SELECT sid, (select score from score as s2 where s2.course_id=s1.course_id ORDER BY score desc LIMIT 0,1) as first_score, (select score from score as s2 where s2.course_id=s1.course_id ORDER BY score desc LIMIT 1,1) as sencond_score from score as s1)as t1 on score.sid = t1.sid WHERE score.score <= t1.first_score and score.score >= t1.sencond_score 45、检索至少选修两门课程的学生学号; SELECT score.student_id as '学生ID',count(course_id) as '课程ID' from score GROUP BY student_id HAVING count(course_id)>=2 46、查询没有学生选修的课程的课程号和课程名; SELECT cid,cname from course WHERE cid not IN( SELECT score.course_id from score GROUP BY score.course_id) 47、查询没带过任何班级的老师id和姓名; SELECT tid,tname from teacher WHERE tid not in( SELECT teach2cls.cid from teach2cls GROUP BY teach2cls.cid) 48、查询有两门以上课程超过80分的学生id及其平均成绩; SELECT score.student_id as '学生ID',avg(score) as '平均成绩' from score WHERE score > 30 GROUP BY student_id HAVING count(course_id) >=2 49、检索“3”课程分数小于60,按分数降序排列的同学学号; select score.student_id from score WHERE score < 60 and course_id = 3 ORDER BY score DESC 50、删除编号为“2”的同学的“1”课程的成绩 delete from score where score.student_id = 2 and score.course_id = 1; 51、查询同时选修了物理课和生物课的学生id和姓名; SELECT sid,sname from student WHERE sid in( SELECT score.student_id from score WHERE course_id in ( SELECT cid from course WHERE course.cname in ('生物','物理')) GROUP BY student_id HAVING count(course_id) =2)