本人小白。
例題:
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# Score2013 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行