关于max()/min()和group by 的坑

一张student表,和一张test表,如下图所示


如果要查询两次考试总分最高的同学那次的考试成绩,可能大家第一反映就是max()和group by:
sql语句:SELECT s.name,t.test,t.math,t.chinese,t.english,max(t.total) from student s LEFT JOIN test t on s.id=t.student_id GROUP BY t.test

结果正确,我差点都相信这条SQL对了!!!

在试一下查询数学成绩最高的。
sql语句:SELECT s.name,t.test,max(t.math),t.chinese,t.english,t.total from student s LEFT JOIN test t on s.id=t.student_id GROUP BY t.test

结果是不是很惊奇,很意外!

那么什么原因导致的呢?
首先max()和min()都只影响()中的这个字段,因此无论是查英语还是数学的最大值,它都是对的,但它不会影响整行数据,所以你会发觉第二次的数学成绩根本就不是A的。
那么第一次为什么对呢?也就是第二次为什么还是A的成绩呢(除了数学)?
这就跟group by 有关!
group by默认返回每一组的第一条数据(每一组的数据排序都是按默认顺序排序的),所以第一次查询结果正确完全是巧合!(SQL错了哈)

那么既然 group by默认返回每一组的第一条数据,我们是不是可以先排序再group by呢?

比如查数学最高的:
SQL语句:SELECT s.name,t.test,t.math,t.chinese,t.english,t.total from student s LEFT JOIN test t on s.id=t.student_id ORDER BY t.math DESC GROUP BY t.test


直接报错,排序语法错误!原来排序根本就不能放在group by前面!不信的话可以移到后面,结果如下:

虽然没报语法错误,但结果只是呵呵哒。。。

对于这种,子查询可以解决
SQL语句: SELECT a.name,a.test,a.math,a.chinese,a.english,a.total from (SELECT s.name,t.test,t.math as math,t.chinese,
t.english,t.total   from student s LEFT JOIN test t on s.id=t.student_id   ORDER BY t.math DESC) as a GROUP BY a.test


  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值