例子:在一個StudentScore表中,有序號ID,班級ClassId,學生姓名Name,性別Sex,語文成績ChineseScore,數學成績MathScore,平均成績AverageScore等等一些學生成績及個人信息字段
問一:每個班級中,平均成績在60(含60)分以上的學生人數?
問二:每個班級中本次考試平均成績是班級前三的同學的所有信息?
問三:每個班級中語文與數學都達到60(含60)分以上的同學的所有信息?
一、Group By 分組
select count(ClassId) from StudentScore where AverageScore>=60 group by ClassId
group by + 字段 A:根據字段A分組查詢,通常group by 是與聚合函數連用的,因為當group by 存在時,select查詢的字段要么是在group by子句中,要么存在聚合函數中,當select后字段獨立時,編譯器將會報錯。錯誤例子:select A,count(B),C from tabel group by A; 錯誤原因:字段C既沒有在group by子句中,也沒有在聚合函數中
二、partition by分區函數(此處只是partition的一小部分功能)
因為要查看每個班級中達到條件的同學的所有信息,那么根據group by的特性可知,此處已不適合使用group by。
select * from (select Row_Number() Over(partition by ClassId order by AverageScore desc) rownum,* from StudentScore) Score where rownum>0 and rownum<4
解釋:首先根據班級ClassId進行分區,在此基礎上再對平均分AverageScore進行降序排列。
partition by 分區函數可以根據某字段分區並返回所有結果集,作為分區函數一般與Row_Number() over()排序一起連用,可實現分區排序的功能。個人覺得:主要是可以返回查詢到的、包含所有字段的結果集。