查询出多个班级内最大、最小、第二大的同学的信息,一条sql完成

本文主要是介绍查询出多个班级内最大、最小、第二大的同学的信息,一条sql完成,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

创建表 

CREATE TABLE `biao` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
  `banji` varchar(10) DEFAULT NULL COMMENT '班级',
  `score` int DEFAULT NULL COMMENT '成绩',
  `name` varchar(10) DEFAULT NULL COMMENT '学生姓名',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; 

插入数据

 INSERT INTO `dmg1`.`biao` (`id`, `banji`, `score`, `name`) VALUES (1, '一年级', 60, '张三');
INSERT INTO `dmg1`.`biao` (`id`, `banji`, `score`, `name`) VALUES (4, '一年级', 90, '赵六');
INSERT INTO `dmg1`.`biao` (`id`, `banji`, `score`, `name`) VALUES (7, '一年级', 20, '李逵');
INSERT INTO `dmg1`.`biao` (`id`, `banji`, `score`, `name`) VALUES (10, '一年级', 30, '李白');
INSERT INTO `dmg1`.`biao` (`id`, `banji`, `score`, `name`) VALUES (13, '一年级', 50, '富贵');
INSERT INTO `dmg1`.`biao` (`id`, `banji`, `score`, `name`) VALUES (16, '一年级', 60, '小九');
INSERT INTO `dmg1`.`biao` (`id`, `banji`, `score`, `name`) VALUES (19, '一年级', 66, '武松');
INSERT INTO `dmg1`.`biao` (`id`, `banji`, `score`, `name`) VALUES (3, '三年级', 80, '王五');
INSERT INTO `dmg1`.`biao` (`id`, `banji`, `score`, `name`) VALUES (6, '三年级', 30, '小红');
INSERT INTO `dmg1`.`biao` (`id`, `banji`, `score`, `name`) VALUES (9, '三年级', 100, '王维');
INSERT INTO `dmg1`.`biao` (`id`, `banji`, `score`, `name`) VALUES (12, '三年级', 80, '王麻子');
INSERT INTO `dmg1`.`biao` (`id`, `banji`, `score`, `name`) VALUES (15, '三年级', 55, '霍三娘');
INSERT INTO `dmg1`.`biao` (`id`, `banji`, `score`, `name`) VALUES (18, '三年级', 22, '花荣');
INSERT INTO `dmg1`.`biao` (`id`, `banji`, `score`, `name`) VALUES (21, '三年级', 80, '镇关西');
INSERT INTO `dmg1`.`biao` (`id`, `banji`, `score`, `name`) VALUES (2, '二年级', 70, '李四');
INSERT INTO `dmg1`.`biao` (`id`, `banji`, `score`, `name`) VALUES (5, '二年级', 40, '王小明');
INSERT INTO `dmg1`.`biao` (`id`, `banji`, `score`, `name`) VALUES (8, '二年级', 10, '宋江');
INSERT INTO `dmg1`.`biao` (`id`, `banji`, `score`, `name`) VALUES (11, '二年级', 70, '张居正');
INSERT INTO `dmg1`.`biao` (`id`, `banji`, `score`, `name`) VALUES (14, '二年级', 70, '张顺');
INSERT INTO `dmg1`.`biao` (`id`, `banji`, `score`, `name`) VALUES (17, '二年级', 33, '田七');
INSERT INTO `dmg1`.`biao` (`id`, `banji`, `score`, `name`) VALUES (20, '二年级', 77, '武大郎');

 sql讲解

1.因为是多个班级,那么我们肯定是要按照班级去进行分组

2.先把最大和最小的查询出来

3.然后再使用窗口函数,dense_rank,这个函数的意思就是 就是对分数进行排名

4.不会跳过排名,比如说相同的分数都是 2 2 2,这样的排名,那么第三名还是显示3

5.对分数进行倒叙排序,然后再对班级进行分区,就和group by一样的意思

6.这样就能查询所有班级的分数的排名

7.然后在外层 只查询分数,因为会存在相同的排名,所以要去重复

8.然后只查询排名是2的,也就是第二大的排名,并且 班级要和最上面的班级一样

9.这样才能显示每个班级的第二大的分数

 

实现查询语句 

SELECT 
b.banji,
max(b.score) as 最大,
min(b.score) as 最小,
(

SELECT DISTINCT score from(
        SELECT
            id,
            banji,
            NAME,
            score,
            DENSE_RANK() over (PARTITION by banji ORDER BY score DESC ) AS paiming
            FROM biao
    )as t
    WHERE paiming=2    and b.banji=banji

)as 第二大

from biao as b
GROUP BY b.banji

因为是多个班级,所以显示每个班级,最大的分数,最小的分数,第二大的分数 

 

这篇关于查询出多个班级内最大、最小、第二大的同学的信息,一条sql完成的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/769766

相关文章

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

MySQL中时区参数time_zone解读

《MySQL中时区参数time_zone解读》MySQL时区参数time_zone用于控制系统函数和字段的DEFAULTCURRENT_TIMESTAMP属性,修改时区可能会影响timestamp类型... 目录前言1.时区参数影响2.如何设置3.字段类型选择总结前言mysql 时区参数 time_zon

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

C#实现获取电脑中的端口号和硬件信息

《C#实现获取电脑中的端口号和硬件信息》这篇文章主要为大家详细介绍了C#实现获取电脑中的端口号和硬件信息的相关方法,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 我们经常在使用一个串口软件的时候,发现软件中的端口号并不是普通的COM1,而是带有硬件信息的。那么如果我们使用C#编写软件时候,如

Mysql DATETIME 毫秒坑的解决

《MysqlDATETIME毫秒坑的解决》本文主要介绍了MysqlDATETIME毫秒坑的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 今天写代码突发一个诡异的 bug,代码逻辑大概如下。1. 新增退款单记录boolean save = s

通过C#获取PDF中指定文本或所有文本的字体信息

《通过C#获取PDF中指定文本或所有文本的字体信息》在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响,然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文... 目录引言C# 获取PDF中指定文本的字体信息C# 获取PDF文档中用到的所有字体信息引言在设计和出

mysql-8.0.30压缩包版安装和配置MySQL环境过程

《mysql-8.0.30压缩包版安装和配置MySQL环境过程》该文章介绍了如何在Windows系统中下载、安装和配置MySQL数据库,包括下载地址、解压文件、创建和配置my.ini文件、设置环境变量... 目录压缩包安装配置下载配置环境变量下载和初始化总结压缩包安装配置下载下载地址:https://d

MySQL中的锁和MVCC机制解读

《MySQL中的锁和MVCC机制解读》MySQL事务、锁和MVCC机制是确保数据库操作原子性、一致性和隔离性的关键,事务必须遵循ACID原则,锁的类型包括表级锁、行级锁和意向锁,MVCC通过非锁定读和... 目录mysql的锁和MVCC机制事务的概念与ACID特性锁的类型及其工作机制锁的粒度与性能影响多版本

MYSQL行列转置方式

《MYSQL行列转置方式》本文介绍了如何使用MySQL和Navicat进行列转行操作,首先,创建了一个名为`grade`的表,并插入多条数据,然后,通过修改查询SQL语句,使用`CASE`和`IF`函... 目录mysql行列转置开始列转行之前的准备下面开始步入正题总结MYSQL行列转置环境准备:mysq