讲讲 group by 的实现原理
總第168篇/張俊紅
寫過 Sql 的同學應該都知道 group by 是用來對數據進行分組的,一般與聚合函數一起使用,對分組后的數據進行聚合。雖然大家都在用,但是有些同學還是不太清楚 group by 的底層到底是如何實現分組并且最后進行聚合的。今天就講講 group by 的底層實現。
我們直接來看例子,下面有一張表 t,存儲了不同日期對應的不同品類的銷量,具體數據如下:
現在我們要統計2019年1月1到1月3期間沒每個品類的總銷量,這個需求我們就可以用 group by 來實現,實現代碼如下:
上面代碼中的 group by 具體執行過程是什么樣子的呢?我們看一下下面這這張圖。
通過上圖我們可以看出 group by 會對所有的數據先根據 cat 字段進行分組,然后針對分組后的數據在組內進行聚合運算(計數、求和、求均值等),最后再將聚合后的每組數據進行匯總就得到了我們想要的結果。在上圖中大家應該看到了分組模塊只有 cat 這一列是標紅加粗,sale_date 和 sales 這兩列是比較虛的字體,為什么會這樣呢?難道我寫錯了?其實不然,是我故意的。為什么要故意呢?我們看一下下面這張圖:
上圖是將表 t 在 Excel 中做一個數據透視表,如果我們只將 cat 這一列拖到行區域的時候,在表中只顯示出了 cat 這一列,別的列是沒有顯示出來的,Sql 中也是一樣的道理,所以我們只有 cat 列是標紅加粗顯示,而其他列是虛的,是因為其他列在這個階段是沒有顯示出來,不過他們也是隨時待命的狀態。
一旦你指明了要按照哪列數據進行聚合,他們就會按照事先分好的組對要聚合的列去進行相應的聚合運算,然后將結果進行匯總,就是我們想要的數據了。
上面的是最簡單的一個例子,就是只按照 cat 這一列進行分組,如果我們現在想要同時對 cat 和 sale_date 這兩列來進行分組的話該怎么實現呢?實現代碼如下:
selectcat,sale_date,sum(sales) fromt where?sale_date?between?"2019/1/1"?and?"2019/1/3" group?by?cat,sale_date這個時候就相當于在透視表里面把 cat 和 sale_date 同時拖到了行區域,但是也是只顯示這兩列,而別的列是不顯示的,只有指明了聚合列的時候,才會把聚合后的結果展示出來。
單純的分組聚合的原理大家應該都明白了,不過這里有一個特別需要注意的點不知道大家有沒有注意到,就是除了聚合列以外,select 后面要查詢的列,必須在 group by 的后面出現。為什么要這樣呢?通過上面的兩個例子,我們也看到了,雖然一個數據表會有多列,但是在 group by 的時候,只會顯示出來你 group by 的列,而其他列是不顯示出來的,沒有顯示出來的列,你在 select 的時候肯定是查詢不到的。
你還可以看:
Sql 的執行順序是怎樣的?
Sql 實現數據透視表功能
講講你不知道的窗口函數
講講 group by 的plus版
介紹一下 information_schema 庫
關于 Group 的另一個函數
內連接的兩種方式
Sql 中的變量使用
你知道 Sql 中 left join 的底層原理嗎?
? ? ? ? ? ? ? ? ? ? ? ? ? ?在看支持下???
總結
以上是生活随笔為你收集整理的讲讲 group by 的实现原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 聊聊GIS中的坐标系|再版 详细定义、计
- 下一篇: 你到底偏哪边的?