日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

讲讲 group by 的实现原理

發布時間:2023/12/19 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 讲讲 group by 的实现原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

總第168篇/張俊紅

寫過 Sql 的同學應該都知道 group by 是用來對數據進行分組的,一般與聚合函數一起使用,對分組后的數據進行聚合。雖然大家都在用,但是有些同學還是不太清楚 group by 的底層到底是如何實現分組并且最后進行聚合的。今天就講講 group by 的底層實現。

我們直接來看例子,下面有一張表 t,存儲了不同日期對應的不同品類的銷量,具體數據如下:

現在我們要統計2019年1月1到1月3期間沒每個品類的總銷量,這個需求我們就可以用 group by 來實現,實現代碼如下:

select????cat????,sum(sales) fromt where?sale_date?between?"2019/1/1"?and?"2019/1/3" group?by?cat

上面代碼中的 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 的实现原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。