广告
返回顶部
首页 > 资讯 > 数据库 >已知如下数据库表,写出查询各门课的分数最高者的SQL语句,要求格式为“科目,学生名,分数”,并按科目Id排序
  • 472
分享到

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

数据库sqlmysql 2023-08-19 16:08:00 472人浏览 泡泡鱼
摘要

题目描述 在某笔试题中遇到了这样的题目,之前学过数据库原理,但是这综合性太强,一下子犯了难。 解决过程 在数据库中建立上述表,以验证写的sql对不对 平台:Navicate SQL 16 for Mysql 尝试写SQL查询 尝

题目描述

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


解决过程

数据库中建立上述表,以验证写的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_newwhere score.Subject_Id = score_new.Subject_Id and score.Score >= score_new.Score;

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

select subject.Subject_Name,student.Student_Name,score.Scorefrom student,subject,score,(select Subject_Id,max(Score) Score from score group by Subject_Id) as score_newwhere 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.Scorefrom student,subject,score,(select Subject_Id,max(Score) Score from score group by Subject_Id) as score_newwhere student.Id=score.Student_Id and subject.Id=score.Subject_Id and score.Subject_Id = score_new.Subject_Id and score.Score >= score_new.Scoreorder by subject.Id;

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


SQL答案

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

来源地址:https://blog.csdn.net/weixin_45798993/article/details/129452233

您可能感兴趣的文档:

--结束END--

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

本文链接: https://www.lsjlt.com/news/375646.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作