Group by分組詳解

2022-06-28 08:48:14 字數 1681 閱讀 6883

先來看一下表1,表名為test:

表1執行如下sql語句:select name from test group by name;

你應該很容易知道執行的結果,沒錯,就是下表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,結果如下圖:

注意:mysql對group by 進行了非ansi標準的擴充套件,允許select後含有非group by 的列。

(已失效)文章出處:理解group by和聚合函式

sql分組資料GROUP BY

分組是使用select語句的group by子句建立的。理解分組最好的辦法就是看乙個例子 輸入 select vend id count as num prods from products group by vend id 輸出 vend id num prods brs01 3 dll01 4 ...

linq 資料分組group by

var results from p in persons group p.car by p.personid into g select new linq在資料分組時,不會像資料庫group by那樣,表面上只返回group by後的一條資料,而是根據要分組的條件,把資料匯聚成乙個字典,字典的鍵為...

資料分組技術GroupBy

其中包括四行 日期 城市 溫度 風力。它的大小為20行。加入這裡按照city這一列進行分組 g df.groupby df city 得到乙個dataframegroupby 型別的物件 g.get group bj 檢視某乙個分組他相當於把city為bj的行都過濾出來,並形成了乙個新的datafr...