MySQL50-11-第41-45题
本文中介绍的是第41-45题,主要包含的知识点:
- 表的自连接查询比较信息
- 找出前2名
- 分组排序+having 过滤
5个题目是
- 查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
- 每门功课最好的前2名
- 统计每门课程的学生选修人数(超过5人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
- 检索至少选修两门课程的学生学号
- 查询选修了全部课程的学生信息
题目41
题目需求
查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
分析过程
- 课程成绩:Score,s_score
- 学生编号:Score,s_id
- 课程编号:Score,c_id
3个字段同时在一个表中,所以我们可以通过一个表Score的自连接来实现查出
SQL实现
1 | select |
我们对学号还需要去重下:
1 | select |
再看看原始的数据中是否符合要求:
题目42
题目需求
查询每门功成绩最好的前两名
分析过程
题目的要求就是找出每门课的前2名同学
- 成绩:Score
- 学科:Course
SQL实现
自己的方法
还需要好好优化的😭
1 | -- 先找出语文的前2名同学 |
将3门学科的信息进行拼接即可求出答案:
1 | -- 最终脚本 |
参考方法(好方法)
如何解决前几名排序的问题🐂🍺🚗太牛了
1 | select |
首先我们看看真实的数据,我们以01课程来进行解释上面的代码:
符合要求count(1)<=2
的只有两种情况
还需要好好理解下😭
题目43
题目需求
统计每门课程的学生选修人数(超过5人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
分析过程
课程号:Score,c_id
学生:Score,s_id
SQL实现
1 | select |
题目44
题目需求
检索至少选修两门课程的学生学号
分析过程
课程:Score,c_id
学号:Score,s_id
SQL实现
结果显示全部满足要求
1 | select |
题目45
题目需求
查询选修了全部课程的学生信息
分析过程
- 首先我们在Course表看看全部课程数目是多少(num)
- 然后在Score表中找出课程是num的学生信息
SQL实现
自己的方法
1、全部的课程数目num
1 | select count(*) from Course; -- 总共3门 |
2、从Score表分组统计每个人的课程数目,满足是3的学生信息
1 | select |
3、我们找出上面结果中的学生信息即可
1 | select |
参考方法
1 | select * -- 3、s_id对应的学生信息 |