mysql实现查询每门课程成绩最好的前两名学生id和姓名

 更新时间:2023年11月28日 09:36:09   作者:小虫子啊  
这篇文章主要介绍了mysql实现查询每门课程成绩最好的前两名学生id和姓名方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

创建库

create database db6;

库下面创建表

班级表:

mysql> create table class(cid int not null unique auto_increment,
-> caption varchar(6) not null,
-> grade_id int not null);

学生表:

mysql> create table student(sid int not null unique auto_increment,
-> sname varchar(3) not null,
-> gender enum(‘male',‘female') not null default ‘male',
-> class_id int not null);

老师表:

mysql> create table teacher(tid int not null unique auto_increment,
-> tname varchar(6));

课程表:

mysql> create table course(cid int not null unique auto_increment,
-> cname varchar(4) not null,
-> teacher_id int );

成绩表:

mysql> create table score(sid int not null unique auto_increment,
-> student_id int not null,
-> course_id int not null,
-> score int not null);

年级表:

mysql> create table class_grade(gid int not null unique auto_increment,
-> gname varchar(6) not null );

班级任职表

mysql> create table teach2cls(tcid int not null unique auto_increment,
-> tid int not null,
-> cid int not null);

自建数据

班级表:

insert class (caption,grade_id) values
(‘一年一班',1),(‘一年二班',1),
(‘二年一班',2),
(‘三年一班',3),(‘三年二班',3),(‘三年三班',3),
(‘四年一班',4),(‘四年二班',4),(‘四年三班',4),(‘四年四班',4);

学生表:

insert student(sname,gender,class_id) values
(‘后羿',‘male',1),(‘盖伦',‘male',2),(‘潘金莲',‘female',1),(‘诸葛亮',‘male',3),
(‘曹操',‘male',3),(‘嬴政',‘male',4),(‘嫦娥',‘female',7),(‘黑老大',‘female',6),
(‘王老二',‘male',5);

老师表:

insert teacher(tname) values (‘狗蛋'),(‘二锅'),(‘老肥');

课程表:

insert course(cname,teacher_id) values
(‘语文',1),(‘数学',2),(‘英语',1),(‘物理',3);

成绩表:

insert score(student_id,course_id,score) values
(1,1,61),(1,2,59),(1,3,10),
(2,4,80),(2,3,25),
(3,1,90),(3,2,33),(3,3,100),(3,4,16),
(4,1,100),(4,2,100),(4,4,100),
(5,1,95),(5,2,19),(5,3,59),
(6,3,11),(6,2,61),
(7,3,85),(7,4,99),
(8,1,85),
(9,2,100);

年级表:

insert class_grade(gname) values
(‘一年级'),(‘二年级'),(‘三年级'),(‘四年级');

班级任职表:

insert teach2cls (tid,cid) values
(1,1),(1,3),(2,2),(3,4),(2,8),(3,6),(1,7),(3,10),(3,9),(1,5);

查询每门课程成绩最好的前两名学生id和姓名

select * from score
where (select count(1)
from score as sc
where score.course_id = sc.course_id
and score.score < sc.score)<2
order by course_id,score desc;
#首先count(1)和count(*)都是统计记录的行数

然后,这个子查询的作用是记录当前查询行和子查询所有符合条件的数量

select count(1) from score as sc where score.course_id = sc.course_id and score.score < sc.score

比如:

id-------course-------score
1----------4 ---------100
2 ---------5 ------------90
3 --------6 ------------80

(只是举例子所列的表)

那么查询的效果就是 select * from score 按行查询

先匹配第一条记录 1-------------4---------------100

  • 然后子查询 select count(1) from score as sc where 4 = sc.course_id and 100 <sc.score 结果0
  • 然后匹配第二条记录 2----------5---------90
  • 然后子查询 select count(1) from score as sc where 5=sc.course_id and 90< sc.score 结果为1
  • 然后匹配第三条记录 3----------6----------80
  • 然后子查询 select count(1) from score as sc where 6 = sc.course_id and 80 < sc.score 结果为2

那么:

又因后面比较了count的结果要<2,所以只有两条记录符合,

上面的原理大概这样:

首先有两个列表 s1 和 s2 ,

s1 是 select * from score as s1 获得 , s2 是子查询中 select count(1) from score as s2 获得

此时s1的学生id、课程id、分数都是固定的

然后开始按照条件比较:

当s1 的课程id 为 4 的时候, s1.course_id = s2.course_id and s1.score < s2.score

  • 这里的s2.course_id 包含了表里所有学生只要课程id是4的所有记录
  • 然后就拿着s1 的分数 和 s2 所有学生的分数进行比较
  • 当s2 的学生分数大于s1 的这个学生分数的时候 count(1) 统计就会+1
  • 然后count<2,就只拿出两条记录

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MySQL触发器Trigger加载及目前局限性

    MySQL触发器Trigger加载及目前局限性

    这篇文章主要为大家介绍了MySQL触发器Trigger加载以及目前局限性详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • 后端服务器中如何实现MySQL数据库操作接口

    后端服务器中如何实现MySQL数据库操作接口

    文章主要介绍了如何在Node.js中使用mysql模块连接MySQL数据库,并通过Express框架实现数据库操作接口,前端可以通过Axios库与后端进行交互,实现数据操作
    2024-11-11
  • MySQL20个高性能架构设计原则(值得收藏)

    MySQL20个高性能架构设计原则(值得收藏)

    这篇文章主要介绍了MySQL20个高性能架构设计原则,帮助大家更好的理解和使用MySQL,感兴趣的朋友可以了解下
    2020-08-08
  • MySQL 常用函数总结

    MySQL 常用函数总结

    这篇文章主要介绍了一些MySQL 常用函数的总结,文中讲解非常细致,帮助大家更好的学习mysql,感兴趣的朋友可以了解下
    2020-08-08
  • mysql实现本地keyvalue数据库缓存示例

    mysql实现本地keyvalue数据库缓存示例

    这篇文章主要介绍了代码实现本地Key-Value缓存示例,大家参考使用吧
    2013-12-12
  • MySQL总是差八个小时该如何解决

    MySQL总是差八个小时该如何解决

    最近在用mybatis时发现,将LocalDateTime插入到数据库时时间少了8小时,下面这篇文章主要给大家介绍了关于MySQL总是差八个小时该如何解决的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • MySQL中事件调度器用法与使用场景详解

    MySQL中事件调度器用法与使用场景详解

    MySQL事件调度器是MySQL 5.1版本引入的一个强大功能,允许数据库管理员创建和调度在特定时间或按照特定间隔自动执行的任务,下面小编就来和大家详细介绍一下它的具体使用吧
    2025-08-08
  • Mysql锁内部实现机制之C源码解析

    Mysql锁内部实现机制之C源码解析

    数据库之所以要加锁,因为数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性
    2022-08-08
  • MySQL 5.7.9 服务无法启动-“NET HELPMSG 3534”的解决方法

    MySQL 5.7.9 服务无法启动-“NET HELPMSG 3534”的解决方法

    这篇文章主要介绍了MySQL 5.7.9 服务无法启动-“NET HELPMSG 3534”的解决方法,需要的朋友可以参考下
    2016-12-12
  • MySQL 主键不推荐使用 UUID 的深层原因及解决方案

    MySQL 主键不推荐使用 UUID 的深层原因及解决方案

    本文介绍了UUID在数据库中的存储空间、索引性能、页分裂、缓存效率等问题,并通过具体测试对比了UUID与其他主键类型(如INT和BIGINT)的性能差异,感兴趣的朋友跟随小编一起看看吧
    2026-01-01

最新评论