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

时间:2022-09-29 09:31:20
一张student表,和一张test表,如下图所示
关于max()/min()和group by 的坑关于max()/min()和group by 的坑

如果要查询两次考试总分最高的同学那次的考试成绩,可能大家第一反映就是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()和group by 的坑
结果是不是很惊奇,很意外!

那么什么原因导致的呢?
首先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

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

虽然没报语法错误,但结果只是呵呵哒。。。
关于max()/min()和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
关于max()/min()和group by 的坑