MySQL数据库练习题

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

分析:需要同时存在01和02两门课程且01成绩高于02的学生信息。分别查出01和02课程的成绩子表,通过SId关联并筛选,最后与Student表JOIN得到完整学生信息。


image.png

1.1 查询同时存在" 01 "课程和" 02 "课程的情况

分析:同时存在两门课程的学生,直接对SC表做自连接(笛卡尔积后过滤SId相同)。


image.png

1.2 查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为NULL)

分析:01课程一定存在,02课程可能不存在,使用LEFT JOIN(左表为01,右表为02)。


image.png

1.3 查询不存在" 01 "课程但存在" 02 "课程的情况

分析:用NOT IN排除选过01课程的学生,再筛选02课程。


image.png

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

分析:对SC表按SId分组求平均分,用HAVING过滤AVG>=60,再与Student表关联获取姓名。


image.png

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

分析:用DISTINCT + 内连接筛选在SC表有记录的学生。


image.png

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

分析:要包含没选课的学生,必须用LEFT JOIN。选课总数和总成绩用GROUP BY聚合,空值自动显示NULL。


image.png

4.1 查有成绩的学生信息

分析:只显示选过课的学生,可用EXISTS子查询。


image.png

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

分析:简单LIKE模糊匹配计数。


image.png

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

分析:多表联合:Student → SC → Course → Teacher,通过教师姓名过滤。


image.png

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

分析:反向思维,先找出选了全部课程的学生,再用NOT IN排除。


image.png

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

分析:先找出01同学选过的课程,再找出至少选过其中一门的其他同学。


image.png

9. 查询和"01"号的同学学习的课程完全相同的其他同学的信息

分析:要求课程集合完全一致,使用双NOT EXISTS确保双方课程互相包含。


image.png

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

分析:三层嵌套或多表联合,排除张三老师的所有课程。


image.png

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

分析:先找出不及格课程>=2的学生,再求其平均成绩,最后关联姓名。


image.png

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

分析:双表联合 + 条件过滤 + ORDER BY DESC。


image.png

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

分析:SC表左连接自身平均成绩子查询,按平均分降序排序。


image.png

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

以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率
及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90
要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
分析:按CId分组,用CASE WHEN统计各区间人数占比。JOIN Course表获取课程名称,按选修人数降序、课程号升序排序。


image.png

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

分析:自左连接,统计比当前分数高的记录数+1即为排名。


image.png

15.1 按各科成绩进行排序,并显示排名, Score 重复时合并名次

分析:使用子查询实现密集排名(DENSE_RANK效果)。


image.png

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

分析:先聚合总分,再用变量实现排名(保留空缺)。


image.png

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

分析:使用DENSE_RANK()实现连续排名(MySQL 8.0+)。


image.png

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

分析:JOIN Course表后用CASE WHEN统计各分数段人数。


image.png

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

分析:自连接统计比当前分数高的记录数<3即为前三名。


image.png

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

分析:简单GROUP BY统计。


image.png

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

分析:GROUP BY后HAVING COUNT=2,再关联Student表。


image.png

21. 查询男生、女生人数

分析:按性别分组计数。


image.png

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

分析:LIKE模糊匹配。


image.png

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

分析:先GROUP BY姓名统计同名人数>1,再列出详细信息。


image.png

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

分析:用YEAR()函数提取年份。


image.png

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

分析:JOIN Course表,GROUP BY后ORDER BY。


image.png

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

分析:GROUP BY + HAVING过滤平均分。


image.png

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

分析:三表联合,过滤课程名和分数。


image.png

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

分析:Student左连接SC,显示所有学生(包括未选课)。


image.png

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

分析:三表联合 + 分数条件。


image.png

30. 查询不及格的课程

分析:DISTINCT去重不及格课程号。


image.png

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

分析:双表联合 + 条件过滤。


image.png

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

分析:简单GROUP BY计数。


image.png

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

分析:多表联合 + ORDER BY DESC + LIMIT 1。


image.png

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

分析:先求最高分,再找出所有等于最高分的学生(支持并列)。


image.png

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

分析:自连接(CId不同但score相同),DISTINCT去重。


image.png

36. 查询每门功成绩最好的前两名

分析:自连接统计比当前分数高的记录<2。


image.png

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

分析:GROUP BY + HAVING过滤人数>5。


image.png

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

分析:GROUP BY + HAVING COUNT >=2。


image.png

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

分析:GROUP BY后HAVING选课数等于总课程数。


image.png

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

分析:用YEAR(CURDATE()) - YEAR(Sage)粗略计算。


image.png

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

分析:使用TIMESTAMPDIFF精确计算年龄。


image.png

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

分析:用WEEKOFYEAR比较生日周。


image.png

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

分析:本周周数+1。


image.png

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

分析:MONTH函数比较。


image.png

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

分析:MONTH+1。


image.png
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容