一个学生分数表,用sql语句查询出各班级的前三名

昨天去一家公司面试,被这道题难住了,哎,又失去一次好的机会。

回来 之后就再想这个问题

表结构及数据如下:

一个学生分数表,用sql语句查询出各班级的前三名

实现的sql语句:

刚开始的实现是

select * from student a where a.id in (SELECT b.id from student b where b.classId=a.classId ORDER BY grade DESC LIMIT 0,3) ;
看起来没毛病,其实一大堆,第一 对于mysql来说,in(里面不能使用limit) 有语法错误,第二 前三名不一定就只有3位哦

尝试改:语句理解:也就是只要班级里有三个学生的分数超过这个学生,那么这个学生就不是前三名。

select * from student b
where
not EXISTS(select * from student c where c.classId=b.classId and b.grade < c.grade GROUP BY c.classId HAVING COUNT(*)>3 )

结果显示

一个学生分数表,用sql语句查询出各班级的前三名

查询次数统计

not exists 其实是嵌套循环。如果student有1000条数据,则会查询1+1000次,如果还不理解,就用java代码协助下

List<Student> students =studentService.queryAll();//查询出全部

for(int i=0;i<students.length();i++){

//过滤前三名

//查询是不是班级前三名

}

所以总共查询1+n次,n表示student表的总条数

感觉不靠谱,如果有10W条数据,就查询了10W次,真是受不了的,再想想,有好方法的朋友快来围观,十分感激!

上一篇:C#获取实体类属性名称


下一篇:pandas删除DataFrame中任意字段等于'null'字符串的行