GROUP BY語句總結(jié)

GROUP BY語句從英文的字面意義上理解就是“根據(jù)(By)一定的規(guī)則進(jìn)行分組(Group)”

作用是通過一定的規(guī)則將一個(gè)數(shù)據(jù)集劃分成若干個(gè)小的區(qū)域禾进,然后針對若干個(gè)小區(qū)域進(jìn)行數(shù)據(jù)處理

在介紹GROUP BY語句之前兜挨,首先需要介紹和它關(guān)系密切的小伙伴——聚合函數(shù)


聚合函數(shù)是對多值數(shù)據(jù)執(zhí)行計(jì)算并返回單值的函數(shù)

以下是常用的聚合函數(shù):

1. AVG——返回平均值,其中空值被忽略

例: select ?dept_no, avg(sal) from table group by dept_no ? //統(tǒng)計(jì)不同部門的平均工資

2.COUNT——返回?cái)?shù)量

例: select count(name) from table ? ?//統(tǒng)計(jì)公司員工總數(shù)

count(字段名)與count(*)的區(qū)別:

如果字段名中包含空值NULL,那么count(字段名)會(huì)忽略該空值,而count(*)不會(huì)忽略,依然將其計(jì)入總數(shù)

例:?

dept_1 dept_2

?A ? ? ? ? ? ? D

?B ? ? ? ? ? null

?C ? ? ? ? ? ?E

由于dept_2 中有 null 值艺挪,用 count(dept_2) 的結(jié)果就是 2,用 count(*) 的結(jié)果就是 3

3. MAX——返回最大值

例: select max(sal) from table ? //查找公司的最高工資

4. MIN——返回最大值

例: select min(sal) from table ? //查找公司的最低工資

5.SUM——返回和

例: select sum(sal) from table ? //統(tǒng)計(jì)公司工資總額


GROUP BY + [分組字段]

其中分組字段可以有多個(gè)兵扬。在執(zhí)行了這個(gè)操作以后麻裳,數(shù)據(jù)集將根據(jù)分組字段的值將一個(gè)數(shù)據(jù)集劃分成各個(gè)不同的小組。

比如有如下數(shù)據(jù)集(Table_Fruitinfo)器钟,其中水果名稱(FruitName)和出產(chǎn)國家(ProductPlace)為聯(lián)合主鍵:


Table_Fruitinfo

如果我們想知道每個(gè)國家有多少種水果津坑,那么我們可以通過如下SQL語句來完成:

SELECT COUNT(*) AS 水果種類, ProductPlaceAS 出產(chǎn)國

FROM Table_Fruitinfo

GROUP BY ProductPlace

這句SQL語句可以解釋成“我按照出產(chǎn)國家(ProductPlace)將數(shù)據(jù)集進(jìn)行分組,然后分別統(tǒng)計(jì)各個(gè)國家的水果種類數(shù)”傲霸。

注意:如果我們這里水果種類不是用Count(*)疆瑰,而是類似如下寫法的話:

SELECT FruitName, ProductPlace

FROM Table_Fruitinfo

GROUP BY ProductPlace

那么SQL在執(zhí)行此語句的時(shí)候會(huì)報(bào)如下的類似錯(cuò)誤:

選擇列表中的列'Table_Fruitinfo.FruitName'無效,因?yàn)樵摿袥]有包含在聚合函數(shù)或GROUPBY子句中

這就是我們需要注意的一點(diǎn)昙啄,使用GROUP BY語句時(shí)穆役,返回集中的非聚合字段要么包含在Group By語句的后面,作為分組的依據(jù)梳凛;要么就要包含在聚合函數(shù)中耿币。

我們可以將GROUP BY操作想象成如下的一個(gè)過程:

首先通過SELECT語句得到一個(gè)結(jié)果集,然后根據(jù)分組字段韧拒,將具有相同分組字段的記錄歸并成了一條記錄淹接。這時(shí)候那些不作為分組依據(jù)的字段就有可能出現(xiàn)多個(gè)值(非聚合字段),但是一種分組情況只能有一條記錄叛溢,而一個(gè)數(shù)據(jù)格是無法放入多個(gè)數(shù)值的塑悼,所以就需要通過一定的處理(聚合函數(shù))將這些多值的列轉(zhuǎn)化成單值,然后放入對應(yīng)的數(shù)據(jù)格中楷掉。

GROUP BY ALL?+ [分組字段]

在不使用 ALL 關(guān)鍵字的情況下厢蒜,包含 GROUP BY 子句的 SELECT 語句查找的結(jié)果只會(huì)顯示滿足搜索條件的記錄。而使用 ALL 關(guān)鍵字,即使某些記錄不滿足搜索條件郭怪,查詢結(jié)果也將顯示 GROUP BY 子句生成的所有組支示,只是這些不滿足搜索條件的記錄不會(huì)進(jìn)行真正的統(tǒng)計(jì)刊橘,而是用默認(rèn)值0或者NULL來代替聚合函數(shù)的返回值鄙才。說得有點(diǎn)繞,舉個(gè)例子吧促绵。

還是使用之前的水果信息數(shù)據(jù)集

Table_Fruitinfo

首先我們不使用帶ALL關(guān)鍵字的Group By語句:

SELECT COUNT(*) AS 水果種類, ProductPlace AS 出產(chǎn)國

FROM?Table_Fruitinfo

WHERE (ProductPlace <> 'Japan')

GROUP BY ProductPlace

操作符 <> 表示 ?“不等于”

那么在最后結(jié)果中由于Japan不符合where語句攒庵,所以分組結(jié)果中將不會(huì)出現(xiàn)Japan。

現(xiàn)在我們加入ALL關(guān)鍵字:

SELECT COUNT(*) AS 水果種類, ProductPlace AS 出產(chǎn)國

FROM Table_Fruitinfo

WHERE ( ProductPlace <> 'Japan')

GROUP BY ALL ProductPlace

重新運(yùn)行后败晴,我們可以看到Japan的分組浓冒,但是對應(yīng)的“水果種類”不會(huì)進(jìn)行真正的統(tǒng)計(jì),聚合函數(shù)會(huì)根據(jù)返回值的類型用默認(rèn)值0或者NULL來代替聚合函數(shù)的返回值尖坤。

GROUP BY + [分組字段] WITH CUBE | ROLL UP

GROUP BY ALL語句不能和CUBE / ROLL UP關(guān)鍵字一起使用

CUBE 運(yùn)算符在 SELECT 語句的 GROUP BY 子句中指定稳懒。SELECT語句后跟所查找的維度列聚合函數(shù)。GROUP BY 后跟所查找的維度列關(guān)鍵字 WITH CUBE

結(jié)果集包含維度列中各值的所有可能組合(笛卡爾積)慢味,以及與這些維度值組合相匹配的基礎(chǔ)行中的聚合值

例:

Inventory

以下查詢將返回一個(gè)結(jié)果集场梆,其中包含Item和Color的所有可能組合的Quantity小計(jì):

SELECT Item, Color, SUM(Quantity) AS QtySum

FROM Inventory

GROUP BY Item, Color WITH CUBE

以下是結(jié)果集:

結(jié)果集

可以看到,CUBE將維度列Item和Color的所有可能屬性(包括null)進(jìn)行組合纯路,形成了3*3=9條不同的記錄或油,每條記錄都包含著一個(gè)小計(jì)QtySum

但是,CUBE 操作生成空值將會(huì)帶來一個(gè)問題:如何區(qū)分 CUBE 操作生成的 NULL 值和在實(shí)際數(shù)據(jù)中返回的 NULL 值驰唬?

可以使用 GROUPING 函數(shù)解決此問題

如果列值來自真實(shí)數(shù)據(jù)(未知數(shù)據(jù))顶岸,GROUPING 函數(shù)將返回 0;如果列值是由 CUBE 操作生成的 NULL叫编,則返回 1辖佣。

在 CUBE 操作中,生成的 NULL 代表所有值搓逾,所以可以將CUBE操作生成的任一 NULL 替換為字符串 ALL

真實(shí)數(shù)據(jù)中的 NULL 表示數(shù)據(jù)值未知卷谈,所以可以將真實(shí)數(shù)據(jù)中的 NULL替換為字符串 UNKNOWN

SELECT CASE WHEN (GROUPING(Item) = 1) THEN 'ALL'

? ? ? ? ? ? ? ? ? ? ? ? ?ELSE ISNULL(Item, 'UNKNOWN')

? ? ? ? ? ? ? END AS Item,

? ? ? ? ? ? ?CASE WHEN (GROUPING(Color) = 1) THEN 'ALL'

? ? ? ? ? ? ? ? ? ? ? ? ELSE ISNULL(Color, 'UNKNOWN')

? ? ? ? ? ? ?END AS Color,

? ? ? ? ? ? ?SUM(Quantity) AS QtySum

FROM Inventory

GROUP BY Item, Color WITH CUBE

ISNULL:使用指定的替換值替換 NULL。

語法:ISNULL ( check_expression , replacement_value )

如果 check_expression 不為 NULL恃逻,那么返回該表達(dá)式的值雏搂;否則返回 replacement_value。

包含具有多個(gè)維度的 CUBE 的 SELECT 語句可生成大型結(jié)果集寇损,因?yàn)檫@些語句會(huì)為所有維度中各值的所有組合都生成相應(yīng)的行凸郑。這些大型結(jié)果集包含的數(shù)據(jù)可能會(huì)過多而不易于閱讀和理解。此問題的一種解決辦法是將SELECT語句放入視圖(VIEW)中:

數(shù)據(jù)庫中的數(shù)據(jù)都是存儲(chǔ)在表中的矛市,而視圖只是一個(gè)或多個(gè)表依照某個(gè)條件組合而成的結(jié)果集

一般來說可以用UPDATE芙沥,INSERT,DELETE等sql語句修改表中的數(shù)據(jù),而對視圖只能進(jìn)行SELECT操作

CREATE VIEW InvCube AS

SELECT CASE WHEN (GROUPING(Item) = 1) THEN 'ALL'

? ? ? ? ? ? ? ? ? ? ? ? ? ELSE ISNULL(Item, 'UNKNOWN')

? ? ? ? ? ? ? ?END AS Item,

? ? ? ? ? ? ? CASE WHEN (GROUPING(Color) = 1) THEN 'ALL'

? ? ? ? ? ? ? ? ? ? ? ? ?ELSE ISNULL(Color, 'UNKNOWN')

? ? ? ? ? ? ? END AS Color,

? ? ? ? ? ? ? SUM(Quantity) AS QtySum

FROM Inventory

GROUP BY Item, Color WITH CUBE

然后即可用該視圖來僅查詢您感興趣的維度值:

SELECT *

FROM InvCube

WHERE Item = 'Chair'

AND Color = 'ALL'

以下是結(jié)果集:

結(jié)果集

參考鏈接:使用 CUBE 匯總數(shù)據(jù)

參考鏈接:使用 ROLLUP 匯總數(shù)據(jù)

由于暫時(shí)沒有理解CUBE與ROLLUP有什么實(shí)質(zhì)性區(qū)別而昨,所以先挖個(gè)坑救氯,以后有機(jī)會(huì)再填

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市歌憨,隨后出現(xiàn)的幾起案子着憨,更是在濱河造成了極大的恐慌,老刑警劉巖务嫡,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甲抖,死亡現(xiàn)場離奇詭異,居然都是意外死亡心铃,警方通過查閱死者的電腦和手機(jī)准谚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來去扣,“玉大人柱衔,你說我怎么就攤上這事∮淅猓” “怎么了唆铐?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長羽氮。 經(jīng)常有香客問我或链,道長,這世上最難降的妖魔是什么档押? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任澳盐,我火速辦了婚禮,結(jié)果婚禮上令宿,老公的妹妹穿的比我還像新娘叼耙。我一直安慰自己,他們只是感情好粒没,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布筛婉。 她就那樣靜靜地躺著,像睡著了一般癞松。 火紅的嫁衣襯著肌膚如雪爽撒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天响蓉,我揣著相機(jī)與錄音硕勿,去河邊找鬼。 笑死枫甲,一個(gè)胖子當(dāng)著我的面吹牛源武,可吹牛的內(nèi)容都是我干的扼褪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼粱栖,長吁一口氣:“原來是場噩夢啊……” “哼话浇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起闹究,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤幔崖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后跋核,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體岖瑰,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡叛买,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年砂代,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片率挣。...
    茶點(diǎn)故事閱讀 39,688評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡刻伊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出椒功,到底是詐尸還是另有隱情捶箱,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布动漾,位于F島的核電站丁屎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏旱眯。R本人自食惡果不足惜晨川,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望删豺。 院中可真熱鬧共虑,春花似錦、人聲如沸呀页。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蓬蝶。三九已至尘分,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間丸氛,已是汗流浹背培愁。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留雪位,地道東北人竭钝。 一個(gè)月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓梨撞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親香罐。 傳聞我的和親對象是個(gè)殘疾皇子卧波,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容