先上網(wǎng)上目前的結(jié)論:
- 必須出現(xiàn)在where之後诊杆,order by之前
- select中的列名必須是分組列或者列函數(shù)
但是牧氮,其實這個結(jié)論是不完整的。
先看表:
-
Student table
-
Apply table
現(xiàn)在,以下的group by是正確的:
select sname, count(distinct uName)
from Apply join Student using (sid)
group by (sid)
;
其實,其中sname換成sid歪今, score, sssize都是對的
按理說按照最開始的結(jié)論颜矿,應該只有sid對才對的
而以下的是錯誤的:
select uName, count(distinct uName)
from Apply join Student using (sid)
group by (sid)
;
其實,uName換成degree嫉晶、decision都是錯的骑疆。
原因是:
結(jié)論還要加上:select中的列名不是分組列且不寫在聚合函數(shù)里也是可以的田篇,但是前提是該列名和分組列應該是一一對應關系
原理是:
首先要明確group by的每一個組在之后生成的查詢結(jié)果表中肯定都是只占一行的。
所以先解釋一下為什么聚合函數(shù)出現(xiàn)在select中肯定是沒問題的:因為聚合函數(shù)生成的只有一個值箍铭,在生成表中只占用一格泊柬。
然后解釋為什么上面的sname以及score以及sssize都可以,因為他們?nèi)齻€屬性都和sid是一一對應關系(在Student表里面sid是主鍵诈火,決定他們仨)兽赁,所以他們仨在生成表里面也都只占用一格。
最后解釋為什么degree那些要報錯冷守,因為他們在join之后的表里面和sid不是一一對應關系刀崖,因此在生成表里面就會占用多格,這就不符合atomic的標準了拍摇。
源于和舍友的討論 <楊~葉>