已知如下数据库表,写出查询各门课的分数最高者的SQL语句,要求格式为“科目,学生名,分数”,并按科目Id排序

文章描述了一位考生在数据库笔试题中遇到的问题,通过建立表并尝试SQL查询来找出每个科目最高分的学生。经过两次尝试,最终成功编写出查询语句,该查询首先通过GroupBy和聚合函数找到每科的最高分,然后通过连接原表和子查询结果,筛选出得分等于最高分的学生信息,最后按科目Id排序得出答案。
摘要由CSDN通过智能技术生成

题目描述

在某笔试题中遇到了这样的题目,之前学过数据库原理,但是这综合性太强,一下子犯了难。
在这里插入图片描述
在这里插入图片描述


解决过程

在数据库中建立上述表,以验证写的SQL对不对

平台:Navicate SQL 16 for MySQL
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

尝试写SQL查询
尝试1

第一次我直观写出来的SQL是这样的:

select Student_Id,Subject_Id,max(Score) from score group by Subject_Id;

运行一下:
在这里插入图片描述
发现并不正确,Subject_Id和max(Score)的关系是正确的,Student_Id的关系是错误的,都被匹配成了Id为1的学生。

原因:

如果要使用group by子句,那么在select指定的字段
要么就要包含在Group By语句的后面,作为分组的依据
要么就要被包含在聚合函数中

这里的Student_Id既没有包含在Group By语句的后面,作为分组的依据,又没有被包含在聚合函数中,所以得到的信息是错误的

尝试2

由于上面SQL运行出来的Student_Id的关系是错误的,于是把它在SQL中去掉再运行一遍看看

select Subject_Id,max(Score) from score group by Subject_Id;

在这里插入图片描述
这样正确找出了各门科目的最高分。

进一步往下思考,怎么得到相应的学生信息?
可以试试把刚刚查出的表和原Score表做一个连接
利用“科目-最高成绩”表,在Score成绩记录表中,找出各门成绩分数≥该门成绩最高分的学生Id,科目Id,分数

select score.Student_Id,score.Subject_Id,score.Score 
from score,(select Subject_Id,max(Score) Score from score group by Subject_Id) as score_new
where score.Subject_Id = score_new.Subject_Id and score.Score >= score_new.Score;

结果如下:
在这里插入图片描述
发现结果是对的。
发现最后的答案 要的是科目和学生名,而不是Id,这时候我们只需要在查询中连接一下科目表和学生表即可。

select subject.Subject_Name,student.Student_Name,score.Score
from student,subject,score,(select Subject_Id,max(Score) Score from score group by Subject_Id) as score_new
where student.Id=score.Student_Id and subject.Id=score.Subject_Id and score.Subject_Id = score_new.Subject_Id and score.Score >= score_new.Score;

查出来的结果为:
在这里插入图片描述
差不多大功告成了,还有一个问题就是,还没有将结果按照科目Id排序,再后面加一个order by字段试试。

select subject.Subject_Name,student.Student_Name,score.Score
from student,subject,score,(select Subject_Id,max(Score) Score from score group by Subject_Id) as score_new
where student.Id=score.Student_Id and subject.Id=score.Subject_Id and score.Subject_Id = score_new.Subject_Id and score.Score >= score_new.Score
order by subject.Id;

在这里插入图片描述
大功告成!


SQL答案

select subject.Subject_Name,student.Student_Name,score.Score
from student,subject,score,(select Subject_Id,max(Score) Score from score group by Subject_Id) as score_new
where student.Id=score.Student_Id and subject.Id=score.Subject_Id and score.Subject_Id = score_new.Subject_Id and score.Score >= score_new.Score
order by subject.Id;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alkali!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值