有成績表如下诡宗,表名稱是sc,字段s_id是學(xué)生編號狡孔,c_id是課程編號害捕,score是課程成績:
問題:求每位同學(xué)的平均成績
首先理解題意,分以下幾步:
根據(jù)題意墨叛,可以想一下預(yù)期的結(jié)果是怎樣的止毕,應(yīng)該有幾個字段,有幾條記錄漠趁。本題應(yīng)該有2個字段:學(xué)生編號扁凛、平均成績,有7條記錄(截圖中s_id有七個非重復(fù)值)闯传;
預(yù)期的結(jié)果有7條記錄谨朝,而源數(shù)據(jù)有18條記錄,由多條變一條的過程是聚合甥绿,需要寫聚合函數(shù)字币,而由多條變成比較少記錄的過程是分組聚合,需要使用group by語句共缕;
需要分組洗出,那group by后面應(yīng)該跟哪個字段,可以看下預(yù)期結(jié)果的字段里面图谷,哪個是主鍵(非空不重復(fù)的字段)翩活,哪個就是分組字段阱洪。學(xué)生編號、平均成績兩個字段中菠镇,學(xué)生編號是主鍵冗荸,所以學(xué)生編號就是分組字段;
輸出的字段寫在select語句辟犀,from后面跟上表的名稱俏竞,where后面跟篩選條件(沒有可不寫),group by 后面跟分組字段堂竟,所以這道題的寫法如下:
select s_id魂毁,avg(score) as 平均成績 from sc group by s_id;
分組聚合的過程是怎樣的?
1.首先是分組出嘹,分組字段是s_id席楚,把s_id一樣的數(shù)據(jù)分到一個組,根據(jù)s_id把sc表分成七份税稼,效果如下:
2.其次是聚合烦秩,聚合是由多變一的過程,就是每一個組變成一條記錄郎仆,有聚合的取聚合的結(jié)果只祠,沒有聚合的取每個組的第一條記錄,avg(score) 取每個組的成績的平均成績(avg是平均函數(shù)扰肌,屬于聚合函數(shù))抛寝,s_id沒有聚合,就取每個組的第一條記錄曙旭,又因為每個組的s_id都一樣盗舰,所以取一個是合理的。過程如下: