MYSQL查询某个字段为最大值的整条数据

遇到一个很有趣的问题,查询数据库中的最大值
首先放一个测试数据表
在这里插入图片描述
如果我想找出最高的分数

SELECT max(score) score from score_test

结果毫无疑问
在这里插入图片描述
那我想找出每个class最高的分数

SELECT class,max(score) score from score_test GROUP BY class

结果为在这里插入图片描述
很明显也是正确的

那现在我想知道每个class最高的分数和人,那么该怎么做呢?查询的字段加个name?我试试

SELECT name,class,max(score) score from score_test GROUP BY class

在这里插入图片描述
不对了,class3最高分55是对的,但是人名却错了,这是为什么呢?
因为

包含 GROUP BY 的 SQL 语句,被 select 的列要么使用聚合函数,要么出现在GROUP BY 子句中。

什么是聚合函数,count(*)就是经典的聚合函数,这里不多说

那么怎么写sql才能获取到正确的结果呢?

方法一:这是我觉得比较合理的

SELECT a.name,a.class,a.score
FROM score_test a 
LEFT JOIN score_test b 
on a.class = b.class and a.score < b.score
where b.score is null

结果没毛病
在这里插入图片描述

这段sql简单来说通过left join和on的特性实现的,left join语句的主表数据必定存在,从表的数据则要通过on后的条件是否符合和判断是否存在。也就是说,在主表和从表都一样的情况下,从表score不存在大于主表score的数据,不就是最大的数据么。

方法二:这个也行,但是感觉不是非常严谨

SELECT a.name,a.class,a.score 
FROM score_test a INNER JOIN
(SELECT class,MAX(score) score FROM score_test GROUP BY class) b
ON a.class = b.class and a.score = b.score

结果也没错
在这里插入图片描述
其实还有其他的方式,但我个人感觉并不是很好用

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值