SQL GROUP BY

本人小白。



例題:

Student(S#,Sname,Sage,Ssex) 學生表

Course(C#,Cname,T#) 課程表

SC(S#,C#,score) 成績表 

Teacher(T#,Tname) 教師表 

student表:

S#                           Sname          Sage   Ssex

2013                 小名        22     男    
2015                 小紅        21     女    
2017                 小明        23     男    
2016                 小凱        24     女    
2014                 小紅        26     女

sc表:

S#                         C#                    Score
2013                 001                 60
2013                 002                 70
2015                 001                 80
2017                 002                 90
2017                 001                 95


查詢所有同學的學號、姓名、選課數、總成績

select student.sname,student.s#,count(sc.C#) as count_c#,sum(sc.score) as sum_score from student left join sc on student.S# = sc.S# group by student.sname,student.s#

輸出

s#                       sname count_c#sum_score
2013                 小名        2        130
2014                 小紅        0        0
2015                 小紅        1        80
2016                 小凱        0        0
2017                 小明        2       185


起初想法就是用left join返回所有學生再加上group by student.S# 就可以解決

select student.sname,student.s#,count(sc.C#) as count_c#,sum(sc.score) as sum_score from student left join sc on student.S# = sc.S# group by student.s#

一運行就報錯

選擇列表中的列 'student.sname' 無效,因爲該列沒有包含在聚合函數或 GROUP BY 子句中。

查了一下原因如下

select之後的字段除了聚集函數外都必須出現在group by中,你可以少於group by中的字段,但不能包含group by中沒有的字段

就在group by後面添加student.sname,student.S#

但是group by 後面多個字段,到底以誰爲標準呢?

測了一下,只要group by後面的字段(列)返回的行數最多,那麼返回集就以那個爲標準

select student.sname,count(sc.C#) as count_c#,sum(sc.score) as sum_score from student left join sc on student.S# = sc.S# group by student.sname     -----a

結果

sname count_c#sum_score
小紅         1         80
小凱         0         0
小名         2        130
小明         2        185

在a的group by 後面加上student.S#

select student.sname,count(sc.C#) as count_c#,sum(sc.score) as sum_score from student left join sc on student.S# = sc.S# group by student.sname,student.S#

結果:

sname count_c#sum_score
小名         2 130
小紅         0 NULL
小紅         1 80
小凱         0 NULL
小明         2 185

student.S#        student.Sname

2013                 小名            
2015                 小紅        
2017                 小明       
2016                 小凱  
2014                 小紅

所佔行數:

5                         4

所有返回集就是5行

發佈了53 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章