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 无法联接常见故障及原因分析

    mysql 无法联接常见故障及原因分析

    这篇文章主要介绍了mysql 无法联接常见故障及原因分析,本文是小编日常收集整理的,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-11-11
  • DBeaver连接mysql数据库图文教程(超详细)

    DBeaver连接mysql数据库图文教程(超详细)

    本文主要介绍了DBeaver连接mysql数据库图文教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • mysql数据库提权的三种方法

    mysql数据库提权的三种方法

    文介绍了MySQL数据库的三种提权方法:UDF提权、MOF提权和启动项提权,同时列出了一些常见数据库及其默认端口,下面就来介绍一下,感兴趣的可以了解一下
    2024-09-09
  • MySQL优化之连接优化

    MySQL优化之连接优化

    MySQL连接优化主要指客户端连接数据库以及数据库为响应客户端的请求而打开数据表和索引的过程中涉及到的参数调整。下面我们来详细的探讨下
    2017-03-03
  • MySQL学习教程之聚簇索引

    MySQL学习教程之聚簇索引

    这篇文章主要给大家介绍了关于MySQL学习教程之聚簇索引的相关资料,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • 浅谈sql语句中GROUP BY 和 HAVING的使用方法

    浅谈sql语句中GROUP BY 和 HAVING的使用方法

    GROUP BY语句和HAVING语句,经过研究和练习,终于明白如何使用了,在此记录一下同时添加了一个自己举的小例子,通过写这篇文章来加深下自己学习的效果,还能和大家分享下,同时也方便以后查阅,一举多得,下面由小编来和大家一起学习
    2019-05-05
  • windows下mysql中binlog日志分析和数据恢复问题

    windows下mysql中binlog日志分析和数据恢复问题

    这篇文章主要介绍了windows下mysql中binlog日志分析和数据恢复问题,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • MySQL5.6.22 绿色版 安装详细教程(图解)

    MySQL5.6.22 绿色版 安装详细教程(图解)

    本文通过图文并茂的形式给大家介绍了MySQL5.6.22 绿色版 安装详细教程,非常不错,具有一定的参考借鉴价值,感兴趣的朋友一起看看吧
    2016-11-11
  • Sql在单一表中检索数据的方法详解

    Sql在单一表中检索数据的方法详解

    这篇文章主要介绍了Sql在单一表中检索数据的方法,SELECT语句是SQL中最常用的语句。它的用途是从一个或多个表中检索信息。为了使用SELECT检索表数据,必须至少给出两条信息:想选择什么、从什么地方选择
    2023-02-02
  • win10 mysql 5.6.35 winx64免安装版配置教程

    win10 mysql 5.6.35 winx64免安装版配置教程

    这篇文章主要为大家详细介绍了win10 mysql 5.6.35 winx64免安装版配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05

最新评论