轉自 http://www.cnblogs.com/wiseblog/articles/4475936.htmlhtml
寫在前面的話:用了很久group by,今天早上一覺醒來,忽然感受group by好陌生,總有個筋別不過來,爲何不可以select * from Table group by id,爲何必定不能是*,而是某一個列或者某個列的聚合函數,group by 多個字段能夠怎麼去很好的理解呢?不過最後仍是轉過來了,簡單寫寫吧,大牛們直接略過吧。數據庫
=========正文開始===========函數
先來看下錶1,表名爲test:spa
表1code
執行以下SQL語句:htm
1blog 2ci |
|
你應該很容易知道運行的結果,沒錯,就是下表2:
表2
但是爲了可以更好的理解「group by」多個列「和」聚合函數「的應用,我建議在思考的過程當中,由表1到表2的過程當中,增長一個虛構的中間表:虛擬表3。下面說說如何來思考上面SQL語句執行狀況:
1.FROM test:該句執行後,應該結果和表1同樣,就是原來的表。
2.FROM test Group BY name:該句執行後,咱們想象生成了虛擬表3,以下所圖所示,生成過程是這樣的:group by name,那麼找name那一列,具備相同name值的行,合併成一行,如對於name值爲aa的,那麼<1 aa 2>與<2 aa 3>兩行合併成1行,全部的id值和number值寫到一個單元格里面。
3.接下來就要針對虛擬表3執行Select語句了:
(1)若是執行select *的話,那麼返回的結果應該是虛擬表3,但是id和number中有的單元格里面的內容是多個值的,而關係數據庫就是基於關係的,單元格中是不容許有多個值的,因此你看,執行select * 語句就報錯了。
(2)咱們再看name列,每一個單元格只有一個數據,因此咱們select name的話,就沒有問題了。爲何name列每一個單元格只有一個值呢,由於咱們就是用name列來group by的。
(3)那麼對於id和number裏面的單元格有多個數據的狀況怎麼辦呢?答案就是用聚合函數,聚合函數就用來輸入多個數據,輸出一個數據的。如cout(id),sum(number),而每一個聚合函數的輸入就是每個多數據的單元格。
(4)例如咱們執行select name,sum(number) from test group by name,那麼sum就對虛擬表3的number列的每一個單元格進行sum操做,例如對name爲aa的那一行的number列執行sum操做,即2+3,返回5,最後執行結果以下:
(5)group by 多個字段該怎麼理解呢:如group by name,number,咱們能夠把name和number 當作一個總體字段,以他們總體來進行分組的。以下圖
(6)接下來就能夠配合select和聚合函數進行操做了。如執行select name,sum(id) from test group by name,number,結果以下圖: