1. 程式人生 > >SQL語句中的Group By

SQL語句中的Group By

先來看下錶1,表名為測試:

 

表1

  執行如下SQL語句:

1

2

SELECT name FROM test

GROUP BY name

  你應該很容易知道執行的結果,沒錯,就是下表2:

 

表2

  可是為了能夠更好的理解“group by”多個列“”聚合函式“的應用,我建議在思考的過程中,由表1到表2的過程中,增加一個虛構的中間表:虛擬表3.下面說說如何來思考上面SQL語句執行情況:

1.FROM測試:該句執行後,應該結果和表1一樣,就是原來的表。

2.FROM測試組BY名稱:該句執行後,我們想象生成了虛擬表3,如下所圖所示,生成過程是這樣的:group by name,那麼找name那一列,具有相同名值的行,合併成一行,如對於名值為aa的,那麼<1 aa 2>與<2 aa 3>兩行合併成1行,所有的id值和數值寫到一個單元格里面。

 

3.就要接下來針對虛擬表3執行選擇語句了:

(1)如果執行select *的話,那麼返回的結果應該是虛擬表3,可是id和數中有的單元格里面的內容是多個值的,而關係資料庫就是基於關係的,單元格中是不允許有多個值的,所以你看,執行select *語句就報錯了。

(2)我們再看名列,每個單元格只有一個數據,所以我們選擇名稱的話,就沒有問題了。為什麼名稱列每個單元格只有一個值呢,因為我們就是用名列出來的。

(3)那麼對於ID和號碼裡面的單元格有多個數據的情況怎麼辦呢?就是答案用聚合函式,聚合函式就用來輸入多個數據,輸出一個數據的。如COUT(ID),和(數),而每個聚合函式的輸入就是每一個多資料的單元格。

(4)例如我們執行選擇名稱,來自測試組的總和(數字)名稱,那麼總和就虛擬表3的數字列的每個單元格進行sum操作,例如對名稱為aa的那一行的數字列執行綜上所述操作,即2 + 3,返回圖5,最後執行結果如下:

 (5)group by多個欄位該怎麼理解呢:如group by name,number,我們可以把名稱和數字看成一個整體欄位

,以他們整體來進行分組的。如下圖

(6)接下來就可以配合選擇和聚合函式進行操作了。如執行選擇名稱,來自測試組的總和(id)按名稱,數字,結果如下圖: