group by和求最值的使用
直接开始:
首先是表数据
要求①: 查询出学生的各个科目和其成绩, 科目的成绩以最高分为最终结果,并按照uid正序排列
细化思路:
第一步 查询学生,科目及其成绩:
SELECT uid,uname,ucourse,uscores
FROM users;
第二步 用group by对uname和ucourse进行分组,并对score取最大值.
在这里初学者可能写错的一个做法是:
SELECT uid,uname,ucourse,MAX(uscores)
FROM users
GROUP BY ucourse,uname;
这种写法会导致的错误是, select之后的max函数选取的结果,可能跟你源数据表的记录不一样, 因为group by之后的数据(uid,uname,ucourse,uscores)均显示为分组后读取到的第一行数据,所以即使select之后有max函数,也是分组后的数据不一致.
此为错误显示
可以看出 :
109 对应的正确的uid为: 10
108 对应的正确的uid为: 14
106 对应的正确的uid为: 13
第三步:所以这里就需要用到 子查询 !!!
先对 表数据里的uscores 进行倒叙排列, 然后进行查询,
SELECT u.uid,u.uname,u.ucourse,u.uscores,MAX(u.uscores)
FROM
(
SELECT *
FROM users
ORDER BY uscores DESC
) AS u
GROUP BY u.uname,u.ucourse
ORDER BY u.uname;
最终显示出正确的结果:
这里呢求的是最大值, 如果 求最小值,就只需要改 max 和 desc即可