一個學生分數表,用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 )

 

結果顯示

 

 

查詢次數統計

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次,真是受不了的,再想想,有好方法的朋友快來圍觀,十分感激!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM