成绩分组取最大值问题
描述
一张班级成绩表 (科目,分数,同学),现需要查出各科目 最高分的同学;
数据库表结构
数据库中数据
name | subject | grade |
1 | lang | 90 |
2 | lang | 87 |
3 | lang | 56 |
4 | lang | 234 |
5 | lang | 23 |
5 | english | 43 |
4 | english | 32 |
3 | english | 21 |
2 | english | 45 |
1 | english | 64 |
1 | math | 23 |
2 | math | 12 |
3 | math | 4 |
4 | math | 43 |
5 | math | 43 |
解
错误示范
name | max(grade) | subject |
5 | 64 | english |
1 | 234 | lang |
1 | 43 | math |
如上所示,该sql语句虽然能查出最大的分数,但是其他列的数据对应关系是错的。而且预期希望查出的math最大分数应该有两个.
解答1
将grade2 表分组后作为新的表,用表联结去查询。
name | subject | grade |
4 | lang | 234 |
1 | english | 64 |
4 | math | 43 |
5 | math | 43 |
解答2
使用not exists
name | subject | grade |
4 | lang | 234 |
1 | english | 64 |
4 | math | 43 |
5 | math | 43 |
上面那个语句还可以写为
效率
为了测试以上三条语句的效率,我向数据库中插入了3万条数据。
按照顺序,三条语句的执行时间分别为
SQL1,用时0.07sec
SQL2,用时1.04sec
SQL3,用时0.44sec
可以看出,exists函数的效率是十分低下的。
Last updated