前言
今天百闻牌更新了新卡包,我开了100多包开出10张ssr,看来是我人生巅峰了。
所以,今天我们还是来做sql。
第十九问
题目:查询学生的总成绩并进行排名
分析:来了来了来了,复习一下昨天学过的知识点。排名可以使用不连续的RANK()
,连续的DENSE_RANK()
和8.0增加的ROW_NUMBER()
。这里我假设题目需要的是ROW_NUMBER()
。
- 学号s_id
- 总成绩SUM(s_score)
- 排名ROW_NUMBER
SELECT s_id '学号',SUM(s_score) '总分',ROW_NUMBER() OVER (ORDER BY SUM(s_score) DESC) 排名
FROM score
GROUP BY s_id
第二十问
题目:查询不同老师所教不同课程平均分从高到低显示
分析:连表查询,主要是为了显示课程的平均分,我们不妨以course
表作为主表。
- 教师号t_id
- 课程号c_id
- 平均分AVG(s_score)
SELECT course.t_id '教师号',course.c_id '课程号',AVG(score.s_score) '平均分'
FROM course
JOIN score
ON course.c_id = score.c_id
GROUP BY course.t_id,course.c_id
ORDER BY AVG(score.s_score) DESC
第二十一问
题目:查询所有课程的成绩第2到3名的学生的姓名和该课程成绩。
分析:题目说的不是很明白,其实就是按课程分组,然后组内排序,最后查询第二名和第三名。分组排序其实我们昨天刚学过,需要使用PARTITION BY
。
- 课程号c_id
- 成绩s_score
- 姓名s_name
- 成绩2到3名ROW_NUMBER IN (2,3)
SELECT a.c_id '课程号',Student.s_name '姓名',a.s_score '分数',a.no '排名'
FROM
(SELECT s_id,s_score,c_id,ROW_NUMBER() OVER(PARTITION BY c_id ORDER BY s_score DESC) 'no'
FROM score) a
JOIN Student
ON a.s_id = Student.s_id
WHERE a.no in (2,3)