group by 的实现原理
轉(zhuǎn)載:https://cloud.tencent.com/developer/article/1513067
寫過 Sql 的同學(xué)應(yīng)該都知道 group by 是用來對(duì)數(shù)據(jù)進(jìn)行分組的,一般與聚合函數(shù)一起使用,對(duì)分組后的數(shù)據(jù)進(jìn)行聚合。雖然大家都在用,但是有些同學(xué)還是不太清楚 group by 的底層到底是如何實(shí)現(xiàn)分組并且最后進(jìn)行聚合的。今天就講講 group by 的底層實(shí)現(xiàn)。
我們直接來看例子,下面有一張表 t,存儲(chǔ)了不同日期對(duì)應(yīng)的不同品類的銷量,具體數(shù)據(jù)如下:
現(xiàn)在我們要統(tǒng)計(jì)2019年1月1到1月3期間沒每個(gè)品類的總銷量,這個(gè)需求我們就可以用 group by 來實(shí)現(xiàn),實(shí)現(xiàn)代碼如下:
select cat ,sum(sales) fromt where sale_date between "2019/1/1" and "2019/1/3" group by cat上面代碼中的 group by 具體執(zhí)行過程是什么樣子的呢?我們看一下下面這這張圖。
通過上圖我們可以看出 group by 會(huì)對(duì)所有的數(shù)據(jù)先根據(jù) cat 字段進(jìn)行分組,然后針對(duì)分組后的數(shù)據(jù)在組內(nèi)進(jìn)行聚合運(yùn)算(計(jì)數(shù)、求和、求均值等),最后再將聚合后的每組數(shù)據(jù)進(jìn)行匯總就得到了我們想要的結(jié)果。在上圖中大家應(yīng)該看到了分組模塊只有 cat 這一列是標(biāo)紅加粗,sale_date 和 sales 這兩列是比較虛的字體,為什么會(huì)這樣呢?難道我寫錯(cuò)了?其實(shí)不然,是我故意的。為什么要故意呢?我們看一下下面這張圖:
上圖是將表 t 在 Excel 中做一個(gè)數(shù)據(jù)透視表,如果我們只將 cat 這一列拖到行區(qū)域的時(shí)候,在表中只顯示出了 cat 這一列,別的列是沒有顯示出來的,Sql 中也是一樣的道理,所以我們只有 cat 列是標(biāo)紅加粗顯示,而其他列是虛的,是因?yàn)槠渌性谶@個(gè)階段是沒有顯示出來,不過他們也是隨時(shí)待命的狀態(tài)。
一旦你指明了要按照哪列數(shù)據(jù)進(jìn)行聚合,他們就會(huì)按照事先分好的組對(duì)要聚合的列去進(jìn)行相應(yīng)的聚合運(yùn)算,然后將結(jié)果進(jìn)行匯總,就是我們想要的數(shù)據(jù)了。
上面的是最簡單的一個(gè)例子,就是只按照 cat 這一列進(jìn)行分組,如果我們現(xiàn)在想要同時(shí)對(duì) cat 和 sale_date 這兩列來進(jìn)行分組的話該怎么實(shí)現(xiàn)呢?實(shí)現(xiàn)代碼如下:
selectcat,sale_date,sum(sales) fromt where sale_date between "2019/1/1" and "2019/1/3" group by cat,sale_date這個(gè)時(shí)候就相當(dāng)于在透視表里面把 cat 和 sale_date 同時(shí)拖到了行區(qū)域,但是也是只顯示這兩列,而別的列是不顯示的,只有指明了聚合列的時(shí)候,才會(huì)把聚合后的結(jié)果展示出來。
單純的分組聚合的原理大家應(yīng)該都明白了,不過這里有一個(gè)特別需要注意的點(diǎn)不知道大家有沒有注意到,就是除了聚合列以外,select 后面要查詢的列,必須在 group by 的后面出現(xiàn)。為什么要這樣呢?通過上面的兩個(gè)例子,我們也看到了,雖然一個(gè)數(shù)據(jù)表會(huì)有多列,但是在 group by 的時(shí)候,只會(huì)顯示出來你 group by 的列,而其他列是不顯示出來的,沒有顯示出來的列,你在 select 的時(shí)候肯定是查詢不到的。
源數(shù)據(jù)如下:
按照c1, c2分組之后:
因?yàn)榈?行和第6行屬于同一個(gè)分組,因此只剩下5條記錄
總結(jié)
以上是生活随笔為你收集整理的group by 的实现原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 性别年龄论文阅读(4)——SSR-Net
- 下一篇: strcat()