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,就只拿出两条记录

总结

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

相关文章

  • 系统高吞吐量下的数据库重复写入问题分析解决

    系统高吞吐量下的数据库重复写入问题分析解决

    这篇文章主要介绍了系统高吞吐量下的数据库重复写入问题分析解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • 概述MySQL统计信息

    概述MySQL统计信息

    本篇文章通过统计信息的概念介绍以及MYSQL统计信息的优势等方面全面概述了MySQL统计信息的相关知识点,有兴趣的朋友学习下。
    2018-02-02
  • mySQL count多个表的数据实例详解

    mySQL count多个表的数据实例详解

    这篇文章通过实例给大家介绍了mySQL中count多个表的数据,也就是多个表如何联合查询,文中通过项目中遇到的一个问题进行分析和实现,给出了详细的示例代码,相信对大家的理解和学习很有帮助,有需要的朋友们下面来一起看看吧。
    2016-11-11
  • MySQL的线程池原理学习教程

    MySQL的线程池原理学习教程

    这篇文章主要介绍了MySQL的线程池原理学习教程,包括线程池的函数调用与关键接口等重要知识,非常推荐!需要的朋友可以参考下
    2015-11-11
  • mysql 海量数据的存储和访问解决方案

    mysql 海量数据的存储和访问解决方案

    数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器
    2010-05-05
  • MySQL与SQL的触发器的不同写法

    MySQL与SQL的触发器的不同写法

    当在SQL、MySQL数据库中一张表中插入一条记录时,触动触发器,使同一数据库的另一张表插入相同记录。
    2010-09-09
  • mysql for update是锁表还是锁行实例详解

    mysql for update是锁表还是锁行实例详解

    在并发一致性控制场景中,我们常常用for update悲观锁来进行一致性的保证,但是如果不了解它的机制,就进行使用,很容易出现事故,比如for update进行了锁表导致其他请求只能等待,从而拖垮系统,这篇文章主要介绍了mysql for update是锁表还是锁行操作,需要的朋友可以参考下
    2024-03-03
  • MySQL 分表优化试验代码

    MySQL 分表优化试验代码

    我们的项目中有好多不等于的情况。今天写这篇文章简单的分析一下怎么个优化法。
    2010-04-04
  • 详细分析MySQL主从复制

    详细分析MySQL主从复制

    这篇文章主要介绍了MySQL主从复制的相关资料,帮助大家更好的理解和学习MySQL,感兴趣的朋友可以了解下
    2020-08-08
  • MySQL的视图和索引用法与区别详解

    MySQL的视图和索引用法与区别详解

    这篇文章主要介绍了MySQL的视图和索引用法与区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07

最新评论