2.查询’生物‘课程比’物理‘课程成绩高的所有学生的学号 思路: 获取所有有生物课程的人(学号,成绩)-临时表 获取所有有物理课程的人(学号,成绩)-临时表 根据【学号】连接两个临时表: 学号 物理成绩 生物成绩 生物---》 SELECT score.sid,score.student_id,course.cname,score.num FROM score LEFT JOIN course ON score.course_id=course.cid WHERE course.cname=‘生物‘; select A.student_id from (select score.sid,score.student_id,course.cname,score.num from score LEFT JOIN course on score.course_id=course.cid where course.cname="生物") as A INNER JOIN (select score.sid,score.student_id,course.cname,score.num from score LEFT JOIN course on score.course_id=course.cid where course.cname="物理") as B on A.student_id = B.student_id where A.num > B.num 3.查询平均成绩大于60分的同学的学号和平均成绩; 思路: 根据学生分组,使用avg获取平均值,通过having对avg进行筛选 select student_id,avg(num) from score group by student_id having avg(num) > 60 进行连表操作: SELECT B.student_id,student.sname,B.mean FROM (SELECT student_id,avg(num) as mean FROM score GROUP BY student_id HAVING avg(num) > 60) as B LEFT JOIN student ON B.student_id=student.sid 4.查询所有同学的学号,姓名,选课数,总成绩; SELECT score.student_id,student.sname,count(student_id),sum(num) FROM score LEFT JOIN student on score.student_id=student.sid GROUP BY score.student_id 5.查询姓’李‘的老师的个数 SELECT count(1) FROM teacher WHERE tname like ‘李%‘; 6.查询没学过’李平老师‘课的同学的学号,姓名; 思路: 先查到’李平老师‘老师教的所有课的 ID 获取选过课的所有学生ID 学生表中筛选 SELECT student.sid,student.sname FROM student WHERE sid NOT in (SELECT student_id FROM score WHERE course_id in (SELECT course.cid FROM course LEFT JOIN teacher ON course.teacher_id=teacher.tid WHERE teacher.tname = ‘李平老师‘) GROUP BY student_id ) 7、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名; 思路: 先查到既选择001又选择002课程的所用同学 根据学生进行分组,如果学生数量等于2 表示 两门均已选择 SELECT student_id,sname FROM (SELECT student_id,course_id FROM score WHERE course_id=1 OR course_id=2 ) as B LEFT JOIN student on B.student_id = student.sid GROUP BY student_id HAVING count(student_id) > 1 8.查询学过’李平‘老师课的同学的学号,姓名; 同上,只不过001和002 变成 in SELECT student.sid,student.sname FROM student WHERE sid in (SELECT student_id FROM score WHERE course_id in (SELECT course.cid FROM course LEFT JOIN teacher ON course.teacher_id=teacher.tid WHERE teacher.tname = ‘李平老师‘) GROUP BY student_id ) 10.查询有课程成绩小于60分的同学的学号,姓名; SELECT sid,sname FROM student WHERE sid in ( SELECT DISTINCT student_id FROM score WHERE num < 60) 11.查询没有学全所有课的同学的学号,姓名; 思路: 在分数表中根据学生进行分组,获取每一个学生选课数量 如果 数量== 总课程数量,表示已经选择了所有课程 SELECT student_id,sname FROM score LEFT JOIN student on score.student_id=student.sid GROUP BY student_id HAVING count(course_id) = (SELECT count(1) FROM course) 12.查询至少一门课程与学号为’001‘的同学所学相同的同学的学号和姓名; 思路: 获取 001 同学 选择的所有课程 获取课程在其中的所有人以及所有课程 根据学生筛选,获取所有学生信息 再与学生表 连接,获取姓名 SELECT student_id,sname,count(course_id) FROM score LEFT JOIN student on score.student_id=student.sid WHERE student_id != 1 AND course_id in (SELECT course_id FROM score WHERE student_id=1) GROUP BY student_id 13.查询至少学过学号为 ’001‘同学所有课的其他同学学号和姓名; 先找到和001的学过所有人 然后个数 = 001所有学科 ==》 其他人可能选择的更多 SELECT student_id,sname,count(course_id) FROM score LEFT JOIN student on score.student_id=student.sid WHERE student_id != 1 AND course_id in (SELECT course_id FROM score WHERE student_id = 1) GROUP BY student_id HAVING count(course_id) = (SELECT count(course_id) FROM score WHERE student_id=1) 14.查询和’002‘号的同学学习的课程完全相同的其他同学学号和姓名;(!!!) 个数相同 002学过的也学过 select student_id from score where student_id in ( select student_id from score where student_id !=1 GROUP BY student_id HAVING count(1) = (select count(1) from score where student_id = 1) ) and course_id in (select course_id from score where student_id = 1) GROUP BY student_id HAVING count(1) = (select count(1) from score where student_id = 1) 15.删除 16.向sc表中插入一些记录,这些记录要求符合以下条件: 1.没有上过编号’002‘课程的同学学号 2.插入’002‘号课程的平均成绩 思路; 由于insert支持 insert into tb1(xx,xx) select x1,x2 from tb2; 所有,获取所有没上过002课 的所有人,获取002的平均成绩 17. 18.查询各科成绩最高和最低分:如下形式显示:课程ID,最高分,最低分; SELECT course_id,max(num) AS max_num,min(num) AS min_num FROM score GROUP BY course_id; 19.按各科平均成绩从低到高和及格率的百分数从高到低顺序; 方法一: SELECT course_id,avg(num),sum(CASE WHEN num<60 THEN 0 ELSE 1 END), sum(1),sum(CASE WHEN num<60 THEN 0 ELSE 1 END)/sum(1) *100 AS percent FROM score GROUP BY course_id ORDER BY avg(num) ASC,percent desc; 方法二: select course_id, avg(num) as avgnum, sum(case when score.num > 60 then 1 else 0 END)/count(1)*100 as percent from score group by course_id order by avgnum asc,percent desc; 20.课程平均分从高到低显示(任课老师) SELECT avg(if(isnull(score.num),0,score.num)),teacher.tname FROM course LEFT JOIN score ON course.cid=score.course_id LEFT JOIN teacher ON course.teacher_id=teacher.tid GROUP BY score.course_id 21.查询各科成绩前三名的记录:(不考虑成绩并列情况) SELECT score.sid,score.course_id,score.num,T.first_num,T.second_num FROM score LEFT JOIN (SELECT sid, (SELECT num FROM score AS s2 WHERE s2.course_id=s1.course_id ORDER BY num DESC LIMIT 0,1) AS first_num, (SELECT num FROM score AS s2 WHERE s2.course_id=s1.course_id ORDER BY num DESC LIMIT 3,1) AS second_num FROM score as s1 ) AS T ON score.sid = T.sid WHERE score.num <= T.first_num AND score.num >= T.second_num 22.查询每门课程被选修的学生数; SELECT course_id,count(1) FROM score GROUP BY course_id 23查询出只选修了一门课程的全部学生的学号和姓名;(!!!) SELECT student.sid,student.sname,count(1) FROM score LEFT JOIN student ON score.student_id=student.sid GROUP BY course_id HAVING count(1) = 1 24.查询男生,女生的人数 SELECT * FROM (SELECT count(1) AS man FROM student WHERE gender=‘男‘) AS A, (SELECT count(1) AS woman FROM student WHERE gender=‘女‘) AS B; 25.查询姓’张‘的学生名单 SELECT sname FROM student WHERE sname LIKE ‘张%‘ 26.查询同名同姓学生名单,并统计同名人数 SELECT sname,count(1) AS count FROM student GROUP BY sname 27.查询每门课的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程降序排列 SELECT course_id,avg(if(isnull(num),0,num)) AS avg FROM score GROUP BY course_id ORDER BY avg ASC,course_id desc 28.查询平均成绩大于85的所有学生的学号,姓名和平均成绩(!!!!未取出 >85) SELECT student_id,sname,avg(if(isnull(num),0,num)) FROM score LEFT JOIN student on score.student_id=student.sid GROUP BY student_id 29.查询课程名称为’生物‘,且分数低于60的学生姓名和分数 SELECT student.sname,score.num FROM score LEFT JOIN course ON score.course_id=course.cid LEFT JOIN student ON score.student_id=student.sid WHERE score.num < 60 AND course.cname=‘生物‘ 30.查询课程编号为003且课程成绩在80分以上的学生的学号和姓名 SELECT * FROM score WHERE score.student_id = 3 and score.num > 80 31.求选了课程的学生人数 select count(c) from ( select count(student_id) as c from score group by student_id) as A; 32.查询选修’张磊‘老师所授课程的学生中,成绩最高的学生姓名及其成绩 SELECT sname,num FROM score LEFT JOIN student ON score.student_id=student.sid WHERE score.course_id in (SELECT course.cid FROM course LEFT JOIN teacher ON course.teacher_id=teacher.tid WHERE tname=‘张磊老师‘) ORDER BY num DESC LIMIT 1 33.查询各个课程及相应的选修人数; select course.cname,count(1) from score left join course on score.course_id = course.cid group by course_id; 34.查询不同课程但成绩相同的学生的学号,课程号,学生成绩(!!!) SELECT DISTINCT s1.course_id,s2.course_id,s1.num,s2.num FROM score AS s1,score AS s2 WHERE s1.num=s2.num AND s1.course_id != s2.course_id 36.检索至少选修两门课程的学生学号 SELECT student_id FROM score GROUP BY student_id HAVING count(student_id) > 1; 37.查询全部学生都选修的课程号和课程名(!!!) SELECT course_id,count(1) FROM score GROUP BY course_id HAVING count(1) = (SELECT count(1) FROM student); 38.查询没学过‘李平‘老师讲授的任意一门课程的学生姓名 SELECT student_id,student.sname FROM score LEFT JOIN student on score.student_id=student.sid WHERE score.course_id NOT in ( SELECT cid FROM course LEFT JOIN teacher ON course.teacher_id=teacher.tid WHERE tname=‘李平老师‘ ) GROUP BY student_id 加 课程名 SELECT student_id,student.sname,course.cname FROM score LEFT JOIN student on score.student_id=student.sid LEFT JOIN course on course_id=course.cid WHERE score.course_id NOT in ( SELECT cid FROM course LEFT JOIN teacher ON course.teacher_id=teacher.tid WHERE tname=‘李平老师‘ ) GROUP BY student_id 39.查询两门以上不及格课程的同学的学号及其平均成绩(!!!) SELECT student_id,count(1) FROM score WHERE num < 60 GROUP BY student_id HAVING count(1) > 2 40.检索’004‘课程分数小于60,按分数 降序 排列的同学学号 SELECT student_id FROM score WHERE num<60 and course_id=4 ORDER BY num DESC;
时间: 2024-10-15 05:45:22