看下一面数据库面试题

面试题:

他们的成绩存放在下表中,现在需要查询每个班的最高分同学,并且显示该同学的名字!

mysql获取每个班级总分最高的学生姓名 sql查询每个班级最高分_接口测试

附建表和初始化数据


-- 1:创建表CREATE TABLE tb_lemon_grade (


分析题目:

数据表中每行记录保存的是每个学生的姓名、各科成绩和班级,现在需求是求出每个班的最高分,所以肯定需要以班级去进行分组(GROUP BY),那最高分的筛选呢,使用聚合函数MAX()吗? 我们说MAX()是求纵向的最大值,但是现在需要求最高分,意思是同一个同学的各科目间也得进行比较,上图红色加粗的成绩就是每个班的最高分,这是通过肉眼查看心算比较得到的结果,我们的心算过程非常简单:找到这个班的所有成绩,再比较各个成绩值,找出最大的分数(重复的也算,相当于并列第一)。 因此,还需要横向的比较!这里介绍一个函数:GREATEST(),看官方的帮助文档,下面的语法说明和例子告诉我们,GREATEST()函数可以返回多个参数间的最大值:

mysql获取每个班级总分最高的学生姓名 sql查询每个班级最高分_软件测试_02

现在开始写SQL:

第一步:先找出每个班的最高分

先分组、再进行MAX()纵向比较得到每科的最大分、再通过GREATEST()横向比较,进而得到该班级的最高分!SELECT class_name, GREATEST( MAX(Linux), MAX(MySQL), MAX(Java))FROM tb_lemon_grade GROUP BY class_name;

mysql获取每个班级总分最高的学生姓名 sql查询每个班级最高分_接口测试_03

第二步:怎么求出每个班的最高分同学?

第一步我们已经得到了每个班的最高分,注意这个最高分并不能确定是某个同学的,因为可能存在多个同学都是最高分(比如班级18期的陈二和张三,都有一科为最高分90分) 通过自然思维筛选出最高分的过程:我已知了该班级的最高分为90分,然后我会拿到这个分数会和这个班中的每个同学的各科分数进行笔记,如果某同学有一门课程的分数也是90分,那就是我们要找的同学! 是不是很好理解?所以,我们先求出每个同学的最高分

第三步:求出每个同学的最高分(横向得到该同学各科的最高分)


SELECT *, GREATEST(Linux, MySQL, Java) maxScore


mysql获取每个班级总分最高的学生姓名 sql查询每个班级最高分_性能测试_04

第四步:两个子查询的结果集关联查询!

通过两个子查询,一个是每个班的最高分学习,一个是每个同学的信息和最高分!


SELECT t2.class_name, t2.student_name, t1.maxScore


mysql获取每个班级总分最高的学生姓名 sql查询每个班级最高分_自动化测试_05