当前位置: 首页 > news >正文

查询每门课程最好的前两名的SQL实现

需求:查询每门课程分数排名前两名的学生,表名Sc(字段:c_no课程号、s_no学号、score分数)

一、整体语句拆分

sql

-- 外层查询:取出最终结果 select a.c_no,a.s_no,a.score from Sc a -- 核心:关联子查询做排名筛选 where (select count(distinct score) from Sc b where b.c_no=a.c_no and b.score>=a.score) <= 2 -- 最后按课程、分数倒序排列 order by a.c_no,a.score desc ;

二、核心逻辑(相关子查询 + 分数去重排名

1. 别名说明

  • a:外层表,遍历每一条成绩记录
  • b:内层表,和a同一张成绩表,用来做对比统计

2. 子查询拆解(最关键部分)

sql

select count(distinct score) from Sc b where b.c_no=a.c_no and b.score>=a.score
  1. b.c_no = a.c_no只对比同一门课程的成绩,不同课程互不干扰。

  2. b.score >= a.score统计:当前这门课中,分数 ≥ 当前学生分数 的所有不同分数有多少个

  3. distinct score对分数去重,代表按「分数档位」排名,不是按人数排名。

  4. count(...)统计出「大于等于当前分数的不同分数个数」,这个数字就是当前分数的名次

3.where 个数 <= 2筛选条件

只保留名次为第 1、第 2 名的记录,也就是每门课前两名。


三、举个例子直观理解

假设课程001成绩数据:

表格

c_nos_noscore
0010195
0010295
0010390
0010485
  1. 遍历a= (001,01,95)子查询:统计课程 001 中score>=95不同分数→ 只有95count = 11<=2,保留这条数据。

  2. 遍历a= (001,02,95)同理count=1→ 保留。

  3. 遍历a= (001,03,90)子查询:score>=90的分数:95、90 →count=22<=2,保留。

  4. 遍历a= (001,04,85)分数:95、90、85 →count=3→ 不保留。

最终结果:95 分两人 + 90 分一人,全部查出(同分并列靠前)。


四、语句特点 & 优缺点

优点

  1. 纯标准 SQL,兼容所有数据库(MySQL、Oracle、SQL Server 都能用)
  2. 实现同分并列排名(经典DENSE_RANK效果)

缺点

  1. 性能差:属于相关子查询,外层每一行都会执行一次子查询,数据量大时很慢。
  2. 逻辑只适用于「按分数档位排名」,和 “按人数取前 2” 有区别。

五、补充:两种排名场景区别(易踩坑)

  1. 本语句效果:按分数排名(并列不占位)多人同分第一,依然都算在前两名内。
  2. 如果需求是「最多取 2 条记录(按人数取前 2)」这条 SQL 不适用,需要改用窗口函数(row_number())。

六、现代写法(MySQL8.0+/Oracle 推荐,性能更好)

用窗口函数替代子查询,逻辑更清晰、效率更高:

sql

-- 每门课按分数倒序排名,取前2名(并列排名) SELECT c_no, s_no, score FROM ( SELECT c_no, s_no, score, DENSE_RANK() OVER(PARTITION BY c_no ORDER BY score DESC) rk FROM Sc ) t WHERE rk <= 2;
http://www.jsqmd.com/news/1014471/

相关文章:

  • 7 硬件工程师笔面试高频考点真题解析——IGBT
  • 实战构建抖音批量下载器:5步掌握无水印内容自动化采集
  • 设计系统中的主题切换:从 CSS 变量到运行时主题引擎的架构实践
  • OpenCore Legacy Patcher解决方案:为老款Mac注入新生命,体验最新macOS系统
  • 2026年 东莞UV打印/亚克力UV打印/UV打印加工/UV彩白彩玻璃贴最新推荐榜单:高精度工艺与创意透光的品质之选 - 品牌发掘
  • BedrockLauncher:颠覆性Minecraft基岩版智能版本管理解决方案
  • 打造你的AI灵魂伴侣:SillyTavern角色卡片完全指南
  • 想高效完成一篇高质量的文献综述,AI辅助工具该怎么选?求真实推荐
  • 117、【Agent】【OpenCode】项目配置(根目录子包配置)
  • 2026免费音频转WMA在线保姆级教程!无限制工具手把手教学,老式Windows Media Player通用 - 时时资讯
  • 激活函数实战指南:从梯度消失到硬件部署的全链路决策
  • 硬盘空间神秘消失?dupeGuru帮你揪出重复文件元凶
  • 搭建本地 apt 源
  • 别再只调solvePnP了!深入对比EPnP、IPPE等6种算法在无人机着陆标志识别中的精度与速度
  • 安能物流200公斤跨省邮寄多少钱?安能物流200公斤跨省运费多少?省钱技巧来了 - 快递物流资讯
  • 技术方案:解决网盘直链下载的跨平台集成挑战
  • 118、【Agent】【OpenCode】项目配置(重复依赖分析)
  • ctf show web入门115
  • 下一代金融数据处理系统:实时订单簿重建技术深度解析
  • Java毕设选题推荐:基于 SpringBoot 的水果商品展示与交易管理系统的设计与实现 生鲜水果线上零售管理平台【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 免费IDM激活脚本完整指南:一键解锁下载加速器
  • 深入解析dex2jar:从Dalvik字节码到Java字节码的专业转换引擎
  • 2026免费视频转MOV在线保姆级教程!无限制工具手把手教学,苹果Final Cut Pro直接导入 - 时时资讯
  • 3DGRUT实战指南:高效高斯粒子光线追踪与栅格化技术深度解析
  • 从写完就发到AI发布策略_CSDN_AI数字营销让内容分发变了什么
  • Java毕设选题推荐:基于 B/S 架构的调查问卷管理系统的设计与实现 基于 Spring Boot 的轻量化问卷采集系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Nature 子刊观点:AI 检测让论文写作陷入两难
  • 2026免费音频转AC3在线保姆级教程!无限制工具手把手教学,杜比数字环绕声制作必备 - 时时资讯
  • 2026年怀化手表回收到底该怎么选?给你推荐五家靠谱的(2026年6月14日最新版) - 空空是也
  • 2026免费视频转WMV在线保姆级教程!无限制工具手把手教学,Windows老系统兼容神器 - 时时资讯