数据库经典面试题之如何取出每科成绩的前三名实现的原理

代码的实现

总结

一、实现的原理

首先,如果不考虑并列的情况,直接orderby排序后limit3就可以取出前三条。但是如果有多个并列的学科,mysql默认情况下分组后指标字段必须使用汇总函数进行汇总,那么limit3只能取出三条成绩,即每科一条。

本题实现的原理是首先将每科成绩分别进行排名,然后取出每科成绩排名前三的成绩即可。

二、代码的实现

● 创建测试表test_course

CREATE TABLE `test_course` (

`id` varchar(10) NOT NULL,

`class` varchar(1000) DEFAULT NULL,

`grade` int(100) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1

● 插入数据

INSERT INTO test.`test_course` VALUES ('1','yuwen','100');

INSERT INTO test.`test_course` VALUES ('10','yingyu','16');

INSERT INTO test.`test_course` VALUES ('11','yingyu','85');

INSERT INTO test.`test_course` VALUES ('12','yingyu','95');

INSERT INTO test.`test_course` VALUES ('2','yuwen','80');

INSERT INTO test.`test_course` VALUES ('3','shuxue','60');

INSERT INTO test.`test_course` VALUES ('4','shuxue','100');

INSERT INTO test.`test_course` VALUES ('5','shuxue','95');

INSERT INTO test.`test_course` VALUES ('6','yuwen','85');

INSERT INTO test.`test_course` VALUES ('7','shuxue','16');

INSERT INTO test.`test_course` VALUES ('8','yuwen','15');

INSERT INTO test.`test_course` VALUES ('9','yingyu','15');

SELECT * FROM test.`test_course`;

查询结果为

● 查出每个科目的全部排名

SELECT S1.*,(SELECT COUNT(1) FROM TEST.`test_course` S2 WHERE S1.CLASS = S2.CLASS AND S2.GRADE > S1.GRADE)+1

AS "paiming"

FROM TEST.`test_course` S1 ORDER BY S1.CLASS,paiming;

查询结果为

● 取出每个科目的前三名

SELECT S1.*,(SELECT COUNT(1) FROM TEST.`test_course` S2 WHERE S1.CLASS = S2.CLASS AND S2.GRADE > S1.GRADE)+1

AS "paiming"

FROM TEST.`test_course` S1 HAVING paiming <=3 ORDER BY S1.CLASS,paiming;

查询结果为

三、总结mySQL中order by进行排序,默认为升序asc,降序为desc。

mySQL中分组关键字为group by,分组后过滤使用having。

mySQL中使用分组group by后,查询字段如果是维度,必须放在group by中,如果是指标,必须使用聚合函数。

最后附上mysql执行顺序一图:

mysql查询各科成绩前三名_No.03 数据库经典面试之如何取出每科成绩的前三名相关推荐

  1. mysql统计每个科目平均成绩_No.03 数据库经典面试之如何取出每科成绩的前三名...

    数据库经典面试题之如何取出每科成绩的前三名 实现的原理 代码的实现 总结 一.实现的原理 首先,如果不考虑并列的情况,直接orderby排序后limit3就可以取出前三条.但是如果有多个并列的学科,m ...

  2. Mysql查询各科成绩前三名并分别排序

    Mysql查询各科成绩前三名并分别排序 这个问题是之前1个朋友学mysql他们老师布置的作业,一开始我没有做过,而且刚出来做开发很多学过的东西都忘记了. 表结构如下: 一开始我是这样写的: selec ...

  3. mysql查询各科成绩前三名的记录,sql查询各科成绩前三名----详述过程,思路清晰不烧脑...

    使用mysql.hive查询各科成绩前三名 一.建表造数据 建表: create table scores( name varchar(100), subject varchar(100), scor ...

  4. mysql查询各科成绩前三名的记录_mysql巧用连表查询各科成绩前三名

    下列是各表的详情,不想自己建表的同学可以直接copy code,数据随意. 创建表成绩详情表: CREATE TABLE score ( id int(10) NOT NULL AUTO_INCREM ...

  5. Mysql 查询blob数据很慢_blob存入数据库很慢

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  6. mysql查询各科前3_MySQL 查询各科前三的数据

    方法一: SELECT sc.*,c.` Cname` ,COUNT(sc.C) FROM sc LEFT JOIN sc a ON sc.C = a.C AND sc.score >= a.s ...

  7. MySQL查询实验报告_SQL实验二:数据库查询实验报告

    实验二 数据库的查询实验 一. 实验目的和要求 (1)掌握SQL Server查询分析器的使用方法,加深对SQL和Transact-SQL语言的查询语句的理解. (2)熟练掌握简单表的数据查询.数据排 ...

  8. mysql查询工资最高三人6_MySQL T6 数据库操作——查询(三)高级查询

    复习 算术运算符:+ - * / % [针对数值型,select子句,where子句] 查询大于18岁的学生,学生表内存的是生日 birthday where year(sysdate()) - ye ...

  9. mysql 查询两张表结构相同的数据库_利用反射处理多个表结构相同的数据的查询和数据库表的关联...

    最近做一个项目,需要对人口数据进行查询,但是人口数据分布在不同的街道表中,首先进行了数据表结构的统一,每个数据表以街道名开头,然后其他的名字都一样 前期将各个表中的字段也进行了统一 抽象出一张字典表 ...

  10. mysql查询库表变更信息_PythonMySQL进行数据库表变更和查询

    这篇文章主要介绍了Python MySQL进行数据库表变更和查询的相关资料,需要的朋友可以参考下 Python连接MySQL,进行数据库表变更和查询: python mysql insert dele ...

最新文章

  1. ASP:HTML在线编辑器的调用方法和使用方法详解
  2. B09_NumPy迭代数组(控制遍历顺序,修改数组中元素的值,使用外部循环,广播迭代)
  3. Unix awk使用手册
  4. 三菱fx5u编程手册_FX5U系列PLC控制伺服3种方式
  5. jdbc url写法(集群)
  6. java stream flatmap
  7. 解决读取数据库里面中文字符乱码的问题
  8. 链表中倒数第 k 个节点
  9. 解决jsp页面数据传递乱码问题
  10. 【计算电磁学】真空中电磁波传播的MATLAB一维FDTD仿真程序
  11. 2022年聚合工艺考试试卷及聚合工艺考试总结
  12. 用Podman来代替Docker Desktop
  13. 重庆医科大学赵浏阳教授招收博士、招聘博士后
  14. 记英语单词中第一个易混淆的单词组attain achieve acquire
  15. 文件名太长无法删除怎么办
  16. 自定义桌面launcher-android
  17. SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelecto
  18. Running pipenv gives TypeError: 'module' object is not callable
  19. 上海理工大学854C语言真题,2018年上海理工大学医疗器械与食品院854C程序设计考研核心题库...
  20. 2001-2020年全国31省城镇居民人均可支配收入/居民实际收入水平

热门文章

  1. oracle lookup函数,LOOKUP函数用法全解(上)——LOOKUP函数的5种用法
  2. Horae开启区块链与Token经济时代的 认知革命
  3. 联想u盘启动linux,联想ThinkPad L540笔记本BIOS设置u盘启动教程
  4. 将图片背景设置为透明的方法介绍
  5. 2019年的读书印记
  6. 惯性系统常用坐标系_惯性坐标系与非惯性坐标系
  7. php下载Excel背景颜色设置,phpExcel生成的Excel背景填充色变黑
  8. Git下载安装(官网) 拉取代码的两种方法
  9. 89c51单片机32个心形流水灯
  10. 微信小程序查询数据库