Mysql:查询每科成绩前二的学生信息和课程信息(即使存在多个第一,也可以有效查询)

Mysql查询每科成绩前二的学生

1.要求:查询每科成绩排名前二的学生信息

首先分别建立学生表(xsb)、课程表(kcb)、成绩表(cjb)。

-- 创建学生表
DROP TABLE IF EXISTS `xsb`;
CREATE TABLE `xsb`  (
  `id` int(11) NOT NULL,
  `sname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci;

-- 插入学生数据
INSERT INTO `xsb` VALUES (1, '张三');
INSERT INTO `xsb` VALUES (2, '李四');
INSERT INTO `xsb` VALUES (3, '王五');
INSERT INTO `xsb` VALUES (4, '赵六');
INSERT INTO `xsb` VALUES (5, '田七');
INSERT INTO `xsb` VALUES (6, '老八');
INSERT INTO `xsb` VALUES (7, '辛九');
INSERT INTO `xsb` VALUES (8, '伍十');


-- 创建课程表
DROP TABLE IF EXISTS `kcb`;
CREATE TABLE `kcb`  (
  `id` int(10) NOT NULL,
  `kname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci;

-- 插入课程信息
INSERT INTO `kcb` VALUES (1, '语文');
INSERT INTO `kcb` VALUES (2, '数学');
INSERT INTO `kcb` VALUES (3, '英语');


-- 创建成绩表
DROP TABLE IF EXISTS `cjb`;
CREATE TABLE `cjb`  (
  `sid` int(10) NOT NULL,
  `kid` int(10) NULL DEFAULT NULL,
  `cj` int(10) NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci;

-- 插入成绩信息
INSERT INTO `cjb` VALUES (1, 1, 95);
INSERT INTO `cjb` VALUES (2, 1, 88);
INSERT INTO `cjb` VALUES (3, 1, 85);
INSERT INTO `cjb` VALUES (4, 1, 89);
INSERT INTO `cjb` VALUES (5, 1, 85);
INSERT INTO `cjb` VALUES (6, 1, 84);
INSERT INTO `cjb` VALUES (7, 1, 77);
INSERT INTO `cjb` VALUES (8, 1, 80);
INSERT INTO `cjb` VALUES (1, 3, 85);
INSERT INTO `cjb` VALUES (2, 3, 90);
INSERT INTO `cjb` VALUES (3, 3, 86);
INSERT INTO `cjb` VALUES (4, 3, 83);
INSERT INTO `cjb` VALUES (5, 3, 80);
INSERT INTO `cjb` VALUES (6, 3, 75);
INSERT INTO `cjb` VALUES (7, 3, 77);
INSERT INTO `cjb` VALUES (8, 3, 80);
INSERT INTO `cjb` VALUES (1, 2, 85);
INSERT INTO `cjb` VALUES (2, 2, 88);
INSERT INTO `cjb` VALUES (3, 2, 86);
INSERT INTO `cjb` VALUES (4, 2, 81);
INSERT INTO `cjb` VALUES (5, 2, 80);
INSERT INTO `cjb` VALUES (6, 2, 75);
INSERT INTO `cjb` VALUES (7, 2, 77);
INSERT INTO `cjb` VALUES (8, 2, 80);

解决方法:

1.自关联查询

意思:表本身关联自己得到过滤条件,即where 后面的自关联查询语句才是过滤条件。

优点:sql简单易懂
缺点:当第一名的分数存在3个或3个以上时,无法查询到第一名的分数。同理第二也是。然后第三、第四就变成第一、第二
思路:创建一张成绩表(cjb)的中间表(zjb),使用count()函数统计成绩表的每个课程的每个学生分数被中间表的分数大于的次数。例如:课程编号1的最高分为95分,那么中间表中课程编号为1的所有分数中的最高分肯定为95(中间表就是成绩表),但是95分不大于95分,所以count()的结果为0,同理,第二名的分数只低于第一名,所以count()的结果为1。

总结:自关联语句中,查询大于主表分数次数小于2的课程号和分数。

select cjb.sid,cjb.kid,cjb.cj from cjb 
 where 
 (select count(1) from cjb zjb 
   where zjb.kid = cjb.kid and cjb.cj<zjb.cj) < 2 
 ORDER BY cjb.kid,cjb.cj DESC;

执行结果如下:
在这里插入图片描述
可以看到,已经查询到了每科前二的学生id,这时候再关联学生表(xsb)和课程表(kcb)即可。

select cjb.sid,xsb.sname,cjb.kid,kcb.kname,cjb.cj from cjb 
 INNER JOIN xsb on xsb.id = cjb.sid 
 INNER JOIN kcb on kcb.id = cjb.kid 
 where (select count(1) from cjb zjb where zjb.kid = cjb.kid and cjb.cj<zjb.cj) < 2 
 ORDER BY cjb.kid,cjb.cj DESC;

但是存在一个大问题!当我们修改课程编号为1,同学id为2和3的分数为95时,再执行语句就会发现,这时候查出来了三个95的成绩,原本89分的同学被过滤了,原因是大于89分的数据有3个,所以当存在三个第一时,第二名的count()值为3,但是我们是取小于2的,所以就查询不到第二名。

-- 修改学生编号2和3的课程id为1的成绩为95
update cjb set cjb.cj = 95 where cjb.kid = 1 and cjb.sid in (2,3);

执行结果如下:
在这里插入图片描述
这时候就得用到第二种方法了。

2.排序、使用变量
优点:修复第一种方法存在的缺陷。会把所有第一和第二的数据查出来。而且可以根据是是否不重复排名来实现不同的需求。重复排名:排名名次可重复,存在多个第一。不重复排名:排名名次唯一。
缺点:sql较复杂。
思路:首先对成绩表的数据进行课程编号升序,课程成绩降序的排序。然后创建三个变量。(@kkid,@rank,@ccj)@kkid变量用于记录课程id,当更换课程时,重置@rank变量的值为0。@rank变量用于记录当前排名数据。@ccj用于存储上一条数据分数,再决定@rank变量的值的时候,和当前数据行的分数进行比较。如果相等则排名不变(实现重复排名)。反之,不重复排名就直接排名加1即可。不需要@ccj变量。

补充:后续发现重复排名有纰漏,如果课程2的最高分数刚刚好等于课程1的最低分数,会出现课程二最高分排名为0。优化:在决定排名名次的时候增加多一个判断。IF(@rank=0,1,@rank)

-- 重复排名:存在多个同名次
SELECT zjb.sid,xsb.sname,zjb.kid,kcb.kname,zjb.cj,zjb.lv FROM 
 (SELECT cjb.*,@rank:=IF(@kkid!=cjb.kid,0,@rank),@rank:=IF(@ccj=cjb.cj,IF(@rank=0,1,@rank),@rank+1) as lv,@ccj:=cjb.cj,@kkid:=cjb.kid FROM cjb,(SELECT @kkid:=-1,@rank:=0,@ccj:=-1) init 
 ORDER BY cjb.kid,cjb.cj DESC) zjb 
 INNER JOIN xsb on xsb.id = zjb.sid 
 INNER JOIN kcb on kcb.id = zjb.kid 
 WHERE zjb.lv in (1,2) ORDER BY zjb.kid,zjb.cj DESC,zjb.lv;

执行结果如下:
在这里插入图片描述

-- 不重复排名:同分数,名次不重复
SELECT zjb.sid,xsb.sname,zjb.kid,kcb.kname,zjb.cj,zjb.lv FROM 
 (SELECT cjb.*,@rank:=IF(@kkid!=cjb.kid,0,@rank),@rank:=@rank+1 as lv,@kkid:=cjb.kid FROM cjb,(SELECT @kkid:=-1,@rank:=0) init 
 ORDER BY cjb.kid,cjb.cj DESC) zjb 
 INNER JOIN xsb on xsb.id = zjb.sid 
 INNER JOIN kcb on kcb.id = zjb.kid 
 WHERE zjb.lv in (1,2) ORDER BY zjb.kid,zjb.cj DESC,zjb.lv;

执行结果如下:
在这里插入图片描述

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
摘要 目,学校工作繁杂、资料重多,管理信息系统已进入高校,但还未普及,而对于学生成绩管理来说,还没有一套完整的、统一的系统。因此,开发一套适和大众的、兼容性好的系统是很有必要的。根据开发要求,它主要应用于教育系统,完成对日常学生成绩的录入查询更新删除等管理操作,实现学生成绩管理的计算机化。开发学生成绩管理系统可使学院教职员工减轻工作压力,比较系统地对教务、教学上的各项服务和信息进行管理,同时,可以减少劳动力的使用,加快查询速度、加强管理。本论文叙述了现在高校学生成绩管理的现状以及JAVA语言和一些开源框架的概况。重点介绍了学生成绩管理系统的实现过程:包括系统分析、 系统调查、 数据库设计、功能设计、系统物理配置方案、 系统实现、系统测试以及系统功能简介。 关键词:JSP,J2EE,学生成绩维护系统,MySQL,Hibernate,Struts Abstract:At present, the school work is numerous and diverse, material is heavy, the management information system enters into the university, but does not popular, but regarding the student achievement management, does not have a set completely and unification system. Therefore, develops a set suitable,populace and compatible good system is very necessary. According to the development request, it mainly applies in the educational system, completes to daily student achievement maintenance operations and so on input inquiry renewal deletion, realizes student achievement maintenance computerizing. Developing the student achievement maintenance system can let the institute teaching and administrative staff to reduce the working pressure, compare with systematically to the educational administration, teaching each service and the information carries on the management, simultaneously, can reduce the labor force which is used, speed up the inquiry speed, strengthen the management. The paper narrated the present university’s study result management in the present situation and the JAVA language and some opens the source frame of the survey. Introduced the realizes process of the student achievement management system: Including the system analysis、the system investigation、the database design、the functional design、the system physics disposition plan、the system realize、the system test and the System Introduction. Key words: JSP, J2EE, Student performance management system, MySQL, Hibernate, Struts 一、绪论 1.1 项目开发背景 一直以来学生的成绩管理是学校工作中的一项重要内容,我国的大中专院校的学生成绩管理水平普遍不高。随着办学规模的扩大和招生人数的增加,建立一个成绩维护系统是非常必要的。普通的成绩管理已不能适应时代的发展,因为它浪费了许多的人力和物力。在当今信息时代这种传统的管理方法必然被以计算机为基础的信息管理系统所代替。为了提高成绩管理的效率,我选择了学生成绩管理系统作为毕业设计的课题。 本系统在大多数成绩管理系统的基础上,主要增加了教师对成绩的操作,教师改完试卷后不用在往学院的教务处办公室报送成绩,可以直接的把成绩上传到网络上,学生也可以方便快速的查询到自己的成绩,考试后教务管理人员也不必总呆在学院的办公室,他们都不受时间,位置,空间的限制,只要有上网的条件,在家里就可以完成有关成绩的录入,更新,管理,查询和删除。本系统将会改变以靠手工管理学生成绩的状况,提高工作效率。希望能为老师和学校的工作带来便利。 1.2 项目开发的目标 建立学生成绩管理系统,采用计算机对学生成绩进行管理,进一步提高办学效益和现代化水平。帮助广大教师提高工作效率,实现学生成绩维护工作流程的系统化、规范化和自动化。为了使系统在学院的管理中发挥更大的作用,实现工作过程的计算机化,提高工作效率和工作质量,现提出如下的系统开发目标: (1)系统应具有实用性、可靠性和适用性,同时注意到先进性。 (2)对各个数据库进行动态管理,防止混乱。 (3)不同用户有不同的查询和修改权限,防止非法查询,非法修改。 (4)能够对查询结果进行分类汇总,实现报表打印和下载。 (5)方便用户的操作,尽量减少用户的操作。 1.3 项目提出的意义 随着高校办学规模的扩大和招生人数的增加,学生成绩管理维护是学校管理中异常重要的一个环节,作为学校,除了育人,就是育知,学生成绩管理的计算机化是整个学校教务管理中的重要一部分,介于它的重要性,学生成绩管理系统的开发与应用就逐渐提入议程,并占着越来越重要的份量。 运用学生成绩管理维护系统可以减轻学院教学人员的工作量,缩小开支,提高工作效率与准确率,能够节省时间,学生也能够尽快的知道自己的考试成绩,投入新的课程的学习或复习这次没有考过的课程。而学生成绩管理系统的应用也为今天的民办教育在未来市场的竞争力有所提高。 在现代高科技的飞跃发展,人们工作习惯的改变,特别是电脑的大量普及,人们生活节奏越来越快,怎样提高工作效率是人们首先考虑的问题。学生成绩管理是一个非常繁琐与复杂的一项工作,一个原因就是工作量大,不好管。对于一个学校而言,管理好学生的成绩,是非常重要的。因此开发出一套学生成绩管理系统是非常必要的。 1.4 系统开发所用的技术准备 1.4.1 数据库技术的现状与发展 数据库是60年代末出现的一门计算机软件技术,到现在虽然只有三十多年的历史,但在理论和时间上都已经趋于成熟,使我们能够方便的使用。数据库技术是信息系统的核心和基础,它的出现极大地促进了计算机应用向各行各业的渗透数据库的建设规模、数据库信息量的大小和使用频度已成为衡量一个国家信息化程度的重要标志。 MySQL作为一种开放源码数据库,以其简单易用的特点广泛被广大用户采用,MySQL虽然是免费的,但同Oracle, Sybase, Informix, Db2等商业数据库一样,具有数据库系统的通用性: (1)数据库管理系统。我们知道,所谓的数据库就是一些结构化的数据的联合体,要提供对这些数据的存取、增加、修改、删除或更加复杂的数据抽取等操作,需要有一个支撑系统,这就是数据库管理系统(DBMS),MySQL完全具有这方面的功能。 (2)关系型数据库管理系统。在数据库的发展历程中,曾出现过多种不同形式的数据库系统,但关系型数据库管理系统(RDBMS)以其优越性而被广为采用,象现在几种广泛使用的数据库全为关系型数据库。同样,MySQL也是关系型的数据库系统,支持标准的结构化查询语言(Structured Query Language)。 (3)开放源码数据库。同商业性的数据库相比,这是MySQL最大的特点。MySQL的源码是公开的,这就意味着任何人,只要遵守GPL的规则都可以对MySQL的源码使用、修改以符合自己特殊的需求。 (4)技术特点。MySQL服务器端是多线程的,为客户端提供了不同的程序接口和链接库,如C、C++、Java、Perl、PHP、Tcl等,也提供了简单的管理工具,如mysqladmin,mysql等。 正因为MySQL的源码是公开的,使得我们有机会从源码级,更深入的了解MySQL。从这一层面上可以探求、了解MySQL数据库的特性:良好的内存管理机制,尤其是内存泄漏的管理,通过了Purify的严格测试;支持多种平台; 提供多种形式的API,为我们开发工具的选择提供了便利; 使用多线程的技术,可充分发挥系统的特点,避免在SMP系统中出现仅使用单CPU的现象;对磁盘表的管理采用B树加密及索引的技术,为我们快速访问数据提供了可能; 高性能的内存申请技术;临时表采用在内存中以哈希表实现;提供多种数据类型;支持定长的和变长的纪录;所有的列都有缺省值,为我们的某些“粗心”提供了方便;灵活、安全的权限和密码系统,密码在传输中加密传送,允许主机端验证密码;13)客户端可以通过TCP/IP、Unix套接字、命名管道(NT)连接到MySQL数据库服务器;对多种字符集的完全支持等等许多优点。MySQL有如此多的特点,又由于其免费的特点,这就给许多的中小应用提供了不错的选择。尤其是对一些中小企业,无论是从降低成本,还是从性能方面,采用MySQL作为其数据支撑系统,都是一种可行的方案。但也应当注意,采用MySQL作为应用数据库,就意味着所有的问题都需要自己解决,要承担一定的风险。 1.4.2 JAVA语言的概述 Java是一种简单的,面象对象的,分布式的,解释的,键壮的,安全的,结构的,中立的,可移植的,性能很优异的多线程的,动态的语言。当1995年SUN推出Java语言之后,全世界的目光都被这个神奇的语言所吸引。 Java语言其实最早诞生于1991年,起初被称为OAK语言,是SUN公司为一些消费性电子产品而设计的一个通用环境。他们最初的目的只是为了开发一种独立于平台的软件技术,而且在网络出现之,OAK可以说是默默无闻,甚至差点夭折。但是,网络的出现改变了OAK的命运。在Java出现以。Internet上的信息内容都是一些乏味死板的HTML文档。这对于那些迷恋于WEB浏览的人们来说简直不可容忍。他们迫切希望能在WEN中看到一些交互式的内容,开发人员也极希望能够在WEB上创建一类无需考虑软硬件平台就可以执行的应用程序,当然这些程序还要有极大的安全保障。对于用户的这种要求,传统的编程语言显得无能为力,而SUN的工程师敏锐地察觉到了这一点,从1994年起,他们开始将OAK技术应用于WEB上,并且开发出了HotJava的第一个版本。当SUN公司1995年正式以Java这个名字推出的时候,几乎所有的WEB开发人员都想到:噢,这正是我想要的。于是Java成了一颗耀眼的明星,丑小鸭一下了变成了白天鹅。 1.4.3 编码
实现了热映、即将上映、电影和影院全局搜索、评论、选座、购票、点赞、收藏、订单等一系列购票和管理流程功能 毕业设计是高等教育阶段学生在完成学业所进行的一项重要学术任务,旨在检验学生通过学习所获得的知识、技能以及对特定领域的深刻理解能力。这项任务通常要求学生运用所学专业知识,通过独立研究和创新,完成一个实际问题的解决方案或者开展一项有价值的项目。 首先,毕业设计的选择通常由学生根据个人兴趣、专业方向以及实际需求来确定。学生需要在导师的指导下明确研究目标、问题陈述,确立研究的范围和深度。毕业设计可以包括文献综述、需求分析、方案设计、实施与测试等多个阶段,以确保整个过程的科学性和系统性。 其次,毕业设计的完成通常需要学生具备一定的独立思考和解决问题的能力。在研究过程中,学生可能需要采用各种研究方法,如实验、调查、案例分析等,以获取必要的数据和信息。通过这些活动,学生能够培养扎实的专业技能,提升解决实际问题的实际能力。 第三,毕业设计的撰写是整个过程的重要组成部分。学生需要将研究过程、方法、结果以及结论等详细记录在毕业论文中,以展示其研究的全貌和成果。同时,撰写毕业设计还有助于提高学生的学术写作水平,培养清晰、逻辑的表达能力。 最后,毕业设计的评价通常由导师和相关专业人士进行。评价标准包括研究的创新性、实用性、方法的科学性以及论文的质量等方面。学生在毕业设计中获得的成绩也将直接影响其最终的学业成绩和学位授予。 总的来说,毕业设计是高等教育中的一项重要环节,通过此过程,学生不仅能够巩固所学知识,还能培养独立思考和解决问题的能力,为将来的职业发展奠定坚实的基础。
成绩管理系统为在线多用户管理系统,采用PHP+MYSQL+AJAX开发,支持在单机、局域网、虚拟主机上运行。程序提供提供8种权限用户:校长室(可查询所有学生成绩信息),班主任(可录入、查询所任班级的所有学生成绩信息),任课老师(可录入、查询所任班级课程的所有学生成绩信息),学生、学生家长(可查询本学生的成绩信息),管理员(最高权限),年级组长(年级中的管理员权限),督察人员(专门针对学生评价系统内容的用户类型)。老师可在网络中录入、修改学生成绩,老师、学生、学生家长登录系统,可查询某一个或多个班的成绩情况,自动排名,自动生成平均分、最高分、最低分;同时可比较多次考试中某个学生的一门或多门程成绩情况(可生成柱状图),学生成绩进步或退步一目了然。支持学生信息、老师信息、任课信息成绩数据的EXCEL导入功能,支持将所有查询结果输出到EXCEL、WORD、PDF进行保存或输出到打印机,支持生成饼状图、直线图便于查询者进行分段统计查看结果。支持"两率一分"查询,支持按考号进行成绩录入。可查询学生单科及总分的年级名次、班级名次,查询结果为静态显示,大大降低用户查询对系统资源的占用,可支持数百位用户同时进行查询。支持留言,老师可对任班主任和任课的班级或对学校进行留言,学生、学生家长可对所在班级或学校进行留言,增强学校、老师、学生、学生家长之间的互动。支持学校发布最新公告及动态信息,老师、学生、学生家长登录本系统后,在第一页面即可看到此信息,方便学校信息的发布。本软件可广泛适用于大、中、小学校及部队或其它一些需要进行成绩统计、管理的单位,我们亦可根据客户的要求进行相应的模块增减。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值