MySQL基础--10.1--sql查询各科成绩前三名

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • sql查询各科成绩前三名
    • 建表
    • 造数
  • 方法一:使用加行号的方式查询
  • 方法二:使用子查询嵌套查询
    • 原理解析
    • 考虑并列情况
  • 方法三:窗口函数
    • 1.ROW_NUMBER
    • 2. 不考虑并列情况:rank()
    • 3.考虑并列情况:dense_rank()


sql查询各科成绩前三名

建表

create table scores(
name varchar(100),
subject varchar(100),
score int
);

造数

insert into scores values
('学生a','java','100'),
('学生b','java','90'),
('学生c','java','90'),
('学生d','java','60'),
('学生e','java','80'),
('学生a','python','100'),
('学生b','python','90'),
('学生c','python','90'),
('学生d','python','60'),
('学生e','python','80');

在这里插入图片描述

方法一:使用加行号的方式查询

  • 不考虑并列情况
    在这里插入图片描述
select score,name,@m1:=@m1+1 r from scores,(select @m1:=0)a where subject='java' order by score desc

查询结果如下
在这里插入图片描述
此处加行号m1的作用就可以体现出来,查询语句中多了一个字段 r ,他可以以数字1,2,3,4,5的形式显示排名

由此引申,此条查询语句结尾在加上 limit 3 便可以取出前三名

select score,name,@m1:=@m1+1 r from scores,(select @m1:=0)a where subject='java' order by score desc limit 3

再引申,若要查询所有课程的成绩,取前三名,则就需要将其他的课程表 join 在一起,关联条件为每条查询语句的行号相等

select s1.score "java成绩",s1.name,s2.score "python成绩",s2.name,s1.r "排名" from
(select score,name,@m1:=@m1+1 r from scores,(select @m1:=0)a where subject='java' order by score desc limit 3)s1 
join
(select score,name,@m2:=@m2+1 r from scores,(select @m2:=0)b where subject='python' order by score desc limit 3)s2
on s1.r=s2.r;

在这里插入图片描述
这种方法查询实际上是 列转行 的方式,将字段subject 列 转成 行 输出。

  • 优点 是容易理解,增加了一个字段显示排名,更加直观。
  • 缺点 是在关联条件多(比如课程数量大于10,查询每科前10名,前20名成绩…)的情况下, join 关联10次以上,频繁的join会损耗系统很多性能,严重的会直接堵塞死。且有个弊端是写查询语句的时候必须要知道具体有几门课及课程名称,where条件就已经限定了每门课的课程id或者课程名称,但有些情况下表数据量很大的时候,这种方法是不合适的。

方法二:使用子查询嵌套查询

SELECT s1.* FROM scores s1
WHERE (SELECT COUNT(1) FROM scores s2 WHERE s1.subject=s2.subject AND s1.score<s2.score)<3
ORDER BY s1.subject,s1.score DESC;

在这里插入图片描述

原理解析

意思是:统计学生个数,即关联两个分数表s1、s2, 外层查询每查询一次,再到内层循环中查询表s2

  1. 外层表首先查询出一条数据
  2. 再到内层循环中查询表s2
  3. 当课程名相同时,统计 s1.score <s2.score 的个数,如果超过3个,证明此时外层的这一行数据的 score 不是此课程的前三名。(因为前三名 ,全班的成绩不应该有超过三个人 比他的分数还高,最多可能是第一名 和第二名比分数高)
  4. 如果满足(s1.score<s2.score)< 3 就是目标前三名的数据 ,保留下来 ,不满足就被where条件过滤掉
  5. 外层下一条数据 继续循环

首先从学生a开始查询
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
此时从学生a到e的 “java” 课程前三名已经筛选完成,对于 “python” 课程,重复上述流程即可

全部筛选完毕最后再对查询出的课程、分数倒序排列即可 :order by s1.subject,s1.score desc

考虑并列情况

elect s1.name,s1.subject,s1.score from scores s1left join (select distinct subject,score from scores) s2on s1.subject=s2.subjectand s1.scoregroup by s1.name,s1.subject,s1.scorehaving count(1)<3order by subject,score desc;

在这里插入图片描述
很直观的可以看出,学生b和c成绩都为90分,并列第二名,学生e成绩80分,为第三名

查询语句解析:

  • 这是在 2.1方法二 的基础上,使用 distinct 关键字对表s2中存在多名同学分数相同的情况进行去重,从而达到并列排名的目的。需要注意的是,由于groub by 的条件是表s1中的字段,所以 count(1)统计的是表s1中每次查询s1.score

方法三:窗口函数

mysql8 或者 HIVE 才支持窗口函数

MySQL基础–10—MySQL8新特性----窗口函数

在这里插入图片描述

1.ROW_NUMBER

在这里插入图片描述

SELECT * FROM 
(SELECT NAME,SUBJECT,score,ROW_NUMBER() over (PARTITION BY SUBJECT ORDER BY score DESC) ranks FROM scores)s
WHERE ranks<4;

在这里插入图片描述

2. 不考虑并列情况:rank()

在这里插入图片描述

SELECT * FROM 
(SELECT NAME,SUBJECT,score,rank() over (PARTITION BY SUBJECT ORDER BY score DESC) ranks FROM scores)s
WHERE ranks<4;

在这里插入图片描述

3.考虑并列情况:dense_rank()

在这里插入图片描述


SELECT * FROM 
(SELECT NAME,SUBJECT,score,dense_rank() over (PARTITION BY SUBJECT ORDER BY score DESC) ranks FROM scores)s
WHERE ranks<4;

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/708089.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全面整理!机器学习常用的回归预测模型

Datawhale干货 作者&#xff1a;曾浩龙&#xff0c;Datawhale意向成员 前言 回归预测建模的核心是学习输入 到输出 &#xff08;其中 是连续值向量&#xff09;的映射关系。条件期望 是 到 的回归函数。简单来说&#xff0c;就是将样本的特征矩阵映射到样本标签空间。 图…

Springboot同一台服务器部署多个项目,导致redis混淆,如何根据不同项目区分

在Spring Boot应用中,如果在同一台服务器上部署了多个项目,并且每个项目都使用Redis作为缓存或存储,为了避免Redis数据混淆,你需要确保各个项目在访问Redis时使用不同的数据库索引号、键前缀或者连接配置。 以下是一些区分不同项目Redis数据的方法: 使用不同数据库索引:…

2024.02.28作业

模拟面试 1. 什么是回调函数 将函数作为另一函数的参数 实现&#xff1a;通过函数指针&#xff0c;如线程的创建函数 2. 结构体和共用体的区别 结构体的每个成员都会分配内存&#xff0c;大小为各个成员所占内存之和&#xff0c;内存对齐 共用体的内存以最大成员为主 3. 赋…

2024年 前端JavaScript Web APIs 第一天 笔记

1.1 -声明变量const优先 1.2 -DOM树和DOM对象 1.3 -获取DOIM元素 1.4 -DOM修改元素内容以及年会抽奖 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content&quo…

【linux系统讲解】

linux系统详细介绍 1. linux系统2. 文件内容操作3. 权限和所有权4. 进程管理5. 用户和群组管理6. 系统信息7. 网络操作8. 打包和解压缩9. 软件包管理10. 系统控制 1. linux系统 Linux是一种强大的开源操作系统&#xff0c;被广泛用于服务器、桌面、手机及嵌入式设备&#xff0…

学习Sora技术报告Video generation models as world simulators

原文链接&#xff1a; Video generation models as world simulators (openai.com) 摘要&#xff1a; 我们探索了在视频数据上大规模训练生成模型。具体来说&#xff0c;我们在可变片长、分辨率和纵横比的视频和图像上联合训练文本条件扩散模型text-conditional diffusion mo…

【Java多线程】面试常考——锁策略、synchronized的锁升级优化过程以及CAS(Compare and swap)

目录 1、锁的策略 1.1、乐观锁和悲观锁 1.2、轻量级锁和重量级锁 1.3、自旋锁和挂起等待锁 1.4、普通互斥锁和读写锁 1.5、公平锁和非公平锁 1.6、可重入锁和不可重入锁 2、synchronized 内部的升级与优化过程 2.1、锁的升级/膨胀 2.1.1、偏向锁阶段 2.1.2、轻量级锁…

2024年阿里云2核4G云服务器性能如何?价格便宜有点担心

阿里云2核4G服务器多少钱一年&#xff1f;2核4G服务器1个月费用多少&#xff1f;2核4G服务器30元3个月、85元一年&#xff0c;轻量应用服务器2核4G4M带宽165元一年&#xff0c;企业用户2核4G5M带宽199元一年。本文阿里云服务器网整理的2核4G参加活动的主机是ECS经济型e实例和u1…

如何更好地准备考研复试呢

准备研究生复试需要全面而细致的策略&#xff0c;以下是一些建议&#xff0c;帮助你更好地应对复试&#xff1a; 深入了解复试流程和要求&#xff1a; 详细了解复试的流程、考察内容和评分标准&#xff0c;确保你对每个环节都有清晰的认识。如果可能&#xff0c;可以向学长学姐…

Groovy(第五节) Groovy 之集合

Groovy 可以直接在语言内使用集合。在 Groovy 中,不需要导入专门的类,也不需要初始化对象。集合是语言本身的本地成员。Groovy 也使集合(或者列表)的操作变得非常容易,为增加和删除项提供了直观的帮助。 可以将范围当作集合 在前一节学习了如何用 Groovy 的范围将循环变得…

OpenHarmony 项目实战:智能体重秤

一、简介 本 demo 基于 OpenHarmony3.1Beta 版本开发&#xff0c;该样例能够接入数字管家应用&#xff0c;通过数字管家应用监测体重秤上报数据&#xff0c;获得当前测量到的体重&#xff0c;身高&#xff0c;并在应用端形成一段时间内记录的体重值&#xff0c;以折线图的形式…

综合能源服务的新型商业模式有哪些

新型商业模式包括配售一体化模式、综合能源服务模式以及“配售一体化能源综合服务”模式&#xff0c;其中: 配售一体化模式:在国外有许多配电网都是由私人进行投资和建设&#xff0c;例如法国、德国等欧洲国家&#xff0c;特别是德国&#xff0c;由于九十年代未私有化浪潮&…

皇冠测评:网络电视盒子哪个品牌好?电视盒子排行榜

欢迎各位来到我们的测评频道&#xff0c;本期我们要分享的产品是电视盒子&#xff0c;因很多网友留言不知道网络电视盒子哪个品牌好&#xff0c;我们通过为期一个月的测评后整理了电视盒子排行榜&#xff0c;想买电视盒子的可以看看下面这五款产品&#xff0c;它们各方面表现非…

mac环境配置OpenGL

9.1 mac环境配置OpenGL 9.1.1 clion配置OpenGL &#xff08;1&#xff09;配置glew 和glfw brew install glew brew install glfw3&#xff08;2&#xff09;配置glad 直接把glad.c文件放置在当前目录文件 &#xff08;3&#xff09;测试代码 cmakelist cmake_minimum_req…

【JGit 】一个完整的使用案例

需求 生成一系列结构相同的项目代码&#xff0c;将这些项目的代码推送至一个指定的 Git 仓库&#xff0c;每个项目独占一个分支。 推送时若仓库不存在&#xff0c;则自动创建仓库。 分析 生成代码使用 Java 程序模拟&#xff0c;每个项目中模拟三个文件。Project.cpp 、Pro…

更改elementui的箭头图片以及位置

//更改箭头位置 .el-tree-node__content > .el-tree-node__expand-icon {position: absolute;right: 12px; }//更改箭头图片 .el-tree-node__expand-icon {transform: rotate(-90deg); } .el-tree-node__expand-icon.expanded {transform: rotate(0deg); } // 有子节点 且已…

qml系列文章目录总览

qml中的信号槽的几种方式 qml中获取Loader加载的顶层对象 qml中QtObject类型的使用 qml与C的交互 qml中Repeter类型的使用 qml中访问控件内部的子项 qml中利用SwipeView和PageIndicator制作轮播图 qml中的default默认属性 qml中StackView的使用 qml 中 row与rowlayout的区别 qm…

TypeScript + react 中 TypeScript 的加入后 , 有哪些优化项目

在使用 TypeScript 结合 React 进行开发时&#xff0c;TypeScript 提供了许多优化和增强代码质量的方式。以下是一些关键的优化操作和最佳实践&#xff1a; 强类型组件属性&#xff08;Props&#xff09;和状态&#xff08;State&#xff09;: 使用接口或类型别名定义组件的 pr…

C++面试 -分布式架构-架构能力:分布式事务的学习

目录 1. 分布式事务的基本概念 2. 分布式事务的需求背景 3. 分布式事务的实现方式 1. 两阶段提交&#xff08;2PC&#xff09; 2. 三阶段提交&#xff08;3PC&#xff09; 3. 补偿事务&#xff08;Saga&#xff09; 4. 分布式事务协调器 4. 分布式事务的挑战 5. 面试准…

QEMU之内存虚拟化

内存虚拟化方案 最直观的方案&#xff0c;将QEMU进程的虚拟地址空间的一部分作为虚拟机的物理地址。但该方案有一个问题&#xff1a; 在物理机上&#xff0c;CPU对内存的访问在保护模式下是通过分段分页实现的&#xff0c;在该模式下&#xff0c;CPU访问时使用的是虚拟地址&am…