⼀个学⽣分数表,⽤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 ade < c.grade GROUP BY c.classId HAVING COUNT(*)>3 )结果显⽰
查询次数统计
not exists 其实是嵌套循环。如果student有1000条数据,则会查询1+1000次,如果还不理解,就⽤java代码协助下
List<Student> students =studentService.queryAll();//查询出全部
for(int i=0;i<students.length();i++){
//过滤前三名
//查询是不是班级前三名
}
所以总共查询1+n次,n表⽰student表的总条数
sql自学难吗感觉不靠谱,如果有10W条数据,就查询了10W次,真是受不了的,再想想,有好⽅法的朋友快来围
观,⼗分感激!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。