關於group by的用法 原理

2021-10-12 04:19:03 字數 2172 閱讀 9774

我和原博文作者一樣,突然間不會用group by了(可能是一直都不會用),就找了一下詳解,這篇文章講的很形象,學習一波

看一下測試表test

對這個表寫group by時,可能就會發生下面這樣的怪事:

select name from test group by name  -- ok

select * from test group by name --error

select name,sum(number) from test group by name -- ok

行吧,接下來一步步的來看。

1. 單列group by

對 test表(表1)執行下面語句

select name from test group by name
結果很明顯,這是表2

為了能夠更好的理解「group by」多個列「和」聚合函式「的應用,由表1到表2的過程中,增加乙個虛構的中間表:虛擬表3。下面說說如何來思考上面sql語句執**況:

from test:sql執行的第一步,找錶,這個沒啥變化;

from test group by name:沒有join 和 where 操作,就是group by了,這時候的過程就如下圖所示了,找到name那一列,將具有相同name值的行,合併成同一行。比如nama = aa時,就將<1,aa,2>和<2,aa,3>這兩行合併,其它字段(id,number)合併在乙個單元格;

接下來就對產生的虛擬表3進行select操作了,這時候就可以看出上面的幾句select的問題出在哪了。

(1)直接 select name 是沒問題的,因為group by 的字段就是name,每個單元格只有乙個name,某悶忒;

(2)執行 select * 的話,就是從表3中選擇,可是id 和 number 欄位中的單元格裡的內容有多個值,關係型資料庫是不允許這樣的,這樣就無法形成嚴格的關係約束條件了,所以會報錯;

那麼,對於 id 和 number列咋辦呢?聚合函式。

不知道大家有沒有遇到過 aggregator blah blah 之類的報錯,我用 group by 的時候就放過這個錯,現在想來應該就是 後面用了 group by,卻沒對字段進行聚合,導致單元格裡有多個值。

聚合函式,就是用來輸入多個資料,輸出乙個資料的,如count(id), sum(number),每個聚合函式的輸入就是每乙個多資料的單元格。

因此,這裡可以執行

select name,sum(number) from test group by name
那麼sum 函式就是對虛擬表3中,每個name對應的number單元格進行sum操作,就可以得到:

2. 對多列進行 group by

那要是group by 多個字段怎麼理解呢, 比如還是在test 表中,group by name,number,此時我們可以將name 和 number 看成乙個整體字段,將其作為乙個整體來進行判斷劃分的。如圖:

這裡只有 和是 name 和 number 都相等的,所以將其進行合併,其餘並不完全一樣,所以沒有進行分組合併。

此時執行以下語句

select name,sum(id) from test group by name,number
就可以得到

done,再次感謝原博文作者。筆芯

關於group by的用法 原理

寫在前面的話 用了好久group by,今天早上一覺醒來,突然感覺group by好陌生,總有個筋別不過來,為什麼不能夠select from table group by id,為什麼一定不能是 而是某乙個列或者某個列的聚合函式,group by 多個字段可以怎麼去很好的理解呢?不過最後還是轉過來...

關於group by的用法 原理

正文開始 先來看下表1,表名為test 表1執行如下sql語句 selectnamefromtest groupbyname 你應該很容易知道執行的結果,沒錯,就是下表2 表2可是為了能夠更好的理解 group by 多個列 和 聚合函式 的應用,我建議在思考的過程中,由表1到表2的過程中,增加乙個...

關於group by的用法 原理

寫在前面的話 用了好久group by,今天早上一覺醒來,突然感覺group by好陌生,總有個筋別不過來,為什麼不能夠select from table group by id,為什麼一定不能是 而是某乙個列或者某個列的聚合函式,group by 多個字段可以怎麼去很好的理解呢?不過最後還是轉過來...