SQL 分組數(shù)據(jù)

連載的上一篇文章队魏,我們講到通過 SQL 聚合函數(shù)可以匯總數(shù)據(jù)公般,比如對行進(jìn)行計數(shù),計算和與平均數(shù)胡桨,獲取最大值和最小值官帘。

但目前為止,我們的匯總都是正對所有行或匹配 WHERE 子句的數(shù)據(jù)上進(jìn)行的昧谊。比如返回供應(yīng)商 DLL01 提供的產(chǎn)品數(shù)目:

SELECT
    COUNT( * ) AS num_prods
FROM
    Products 
WHERE
    vend_id = 'DLL01';

運(yùn)行結(jié)果:

那如果我們想要返回每個供應(yīng)商提供的產(chǎn)品數(shù)目呢刽虹?這就需要用到分組聚合了。使用分組可以將數(shù)據(jù)分為多個邏輯組呢诬,然后對每個組進(jìn)行聚合計算涌哲。

分組

分組的創(chuàng)建使用 SELECT 語句中的 GROUP BY 子句,比如下面的 SQL 返回每個供應(yīng)商提供的產(chǎn)品數(shù)目:

SELECT
    vend_id,
    COUNT( * ) AS num_prods 
FROM
    Products 
GROUP BY
    vend_id;

運(yùn)行結(jié)果:

上述 SELECT 語句返回兩個列尚镰,vend_id 為供應(yīng)商 ID阀圾,是分組字段;num_prods 為計算字段狗唉,使用 count(*) 聚合而來初烘。GROUP BY 子句告訴 DBMSvend_id 排序并分組數(shù)據(jù),然后對每個分組而不是整個數(shù)據(jù)集進(jìn)行聚合分俯。

注 1:GROUP BY 子句可以包含多個列肾筐,即允許分組嵌套。此外缸剪,除聚合函數(shù)返回的計算字段外吗铐,SELECT 語句后跟的每一列都必須在 GROUP BY 子句中給出。

注 2:如果分組中存在 NULL 值的行杏节,則 NULL 將作為一個分組返回唬渗;多個 NULL 值將被分為一組讥此。

過濾分組

除了使用 GROUP BY 分組數(shù)據(jù)外,SQL 還允許過濾分組谣妻,規(guī)定包含哪些分組,排除哪些分組卒稳。比如蹋半,我們只想列出供應(yīng)產(chǎn)品數(shù)目在 2 種以上的供應(yīng)商及其供應(yīng)產(chǎn)品的數(shù)目。

這里有個過濾條件:供應(yīng)產(chǎn)品數(shù)目大于 2充坑,條件中的 供應(yīng)產(chǎn)品數(shù)目 是針對分組后進(jìn)行聚合產(chǎn)生的計算字段减江,因此無法使用 WHERE 子句。WHERE 子句過濾時指定的是行捻爷,而不是分組辈灼。

為此,SQL 提供了 HAVING 子句來過濾分組也榄,并且 HAVING 支持所有 WHERE 操作符巡莹。下面,我們來完成供應(yīng)產(chǎn)品數(shù)目在 2 種以上的供應(yīng)商及其供應(yīng)產(chǎn)品的數(shù)目甜紫。

SELECT
    vend_id,
    COUNT( * ) AS num_prods 
FROM
    Products 
GROUP BY
    vend_id 
HAVING
    num_prods > 2;

運(yùn)行結(jié)果:

跟前面的結(jié)果相比降宅,供應(yīng)產(chǎn)品數(shù)目等于 2 的供應(yīng)商信息就不見啦~

注:WHERE 過濾行,HAVING 過濾分組囚霸。也可以理解為 WHERE 在分組前進(jìn)行過濾腰根,HAVING 在數(shù)據(jù)分組后進(jìn)行過濾。

關(guān)于 WHERE 子句和 HAVING 子句的區(qū)別拓型,我們可以再通過一個案例理解一下额嘿。下面的 SQL 檢索具有兩個或以上產(chǎn)品且其價格大于等于 4 的供應(yīng)商。

其中產(chǎn)品表如下:

SQL 語句如下:

SELECT
    prod_id,
    COUNT( * ) AS prod_num 
FROM
    Products 
WHERE
    prod_price >= 4 
GROUP BY
    vend_id 
HAVING
    prod_num >= 2;

運(yùn)行結(jié)果:

附:SELECT 子句順序

截止目前劣挫,我們已經(jīng)學(xué)了不少的 SELECT 子句册养,下面小魚針對目前我們已經(jīng)學(xué)習(xí)的 SELECT 子句來總結(jié)一下他們在 SELECT 語句中的先后順序。

表中子句的排列順序即為它們在 SELECT 語句中依次出現(xiàn)的次序:

子句 說明 是否必須使用
SELECT 返回的列或表達(dá)式
FROM 從中檢索數(shù)據(jù)的表 僅在從表中檢索數(shù)據(jù)時使用
WHERE 行級過濾
GROUP BY 分組數(shù)據(jù) 僅在分組聚合時使用
HAVING 組級過濾
ORDER BY 對結(jié)果進(jìn)行排序

還是上面的例子压固,檢索具有兩個或以上產(chǎn)品且其價格大于等于 4 的供應(yīng)商和其供應(yīng)的產(chǎn)品數(shù)目捕儒,不過檢索檢索需要按照產(chǎn)品數(shù)目升序排列。

SELECT
    prod_id,
    COUNT( * ) AS prod_num 
FROM
    Products 
WHERE
    prod_price >= 4 
GROUP BY
    vend_id 
HAVING
    prod_num >= 2 
ORDER BY
    prod_num;

運(yùn)行結(jié)果:

總結(jié)

本節(jié)邓夕,我們學(xué)習(xí)了使用 GROUP BY 子句對多組數(shù)據(jù)進(jìn)行匯總計算刘莹,并返回每個分組的結(jié)果。并實(shí)踐了如何使用 HAVING 子句過濾分組焚刚。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末点弯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子矿咕,更是在濱河造成了極大的恐慌抢肛,老刑警劉巖狼钮,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異捡絮,居然都是意外死亡熬芜,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門福稳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涎拉,“玉大人,你說我怎么就攤上這事的圆」呐。” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵越妈,是天一觀的道長季俩。 經(jīng)常有香客問我,道長梅掠,這世上最難降的妖魔是什么酌住? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮阎抒,結(jié)果婚禮上赂韵,老公的妹妹穿的比我還像新娘。我一直安慰自己挠蛉,他們只是感情好祭示,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著谴古,像睡著了一般质涛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上掰担,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天汇陆,我揣著相機(jī)與錄音,去河邊找鬼带饱。 笑死毡代,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的勺疼。 我是一名探鬼主播教寂,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼执庐!你這毒婦竟也來了酪耕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤轨淌,失蹤者是張志新(化名)和其女友劉穎迂烁,沒想到半個月后看尼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盟步,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年藏斩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片却盘。...
    茶點(diǎn)故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡狰域,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谷炸,到底是詐尸還是另有隱情,我是刑警寧澤禀挫,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布旬陡,位于F島的核電站,受9級特大地震影響语婴,放射性物質(zhì)發(fā)生泄漏描孟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一砰左、第九天 我趴在偏房一處隱蔽的房頂上張望匿醒。 院中可真熱鬧,春花似錦缠导、人聲如沸廉羔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽憋他。三九已至,卻和暖如春髓削,著一層夾襖步出監(jiān)牢的瞬間竹挡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工立膛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留揪罕,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓宝泵,卻偏偏與公主長得像好啰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子儿奶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評論 2 353

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