最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mysql按條件計(jì)數(shù)多種實(shí)現(xiàn)方法詳解

 更新時(shí)間:2020年07月16日 12:01:20   作者:網(wǎng)絡(luò)蟲  
這篇文章主要介紹了Mysql按條件計(jì)數(shù)多種實(shí)現(xiàn)方法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

最近在給某網(wǎng)站的后臺(tái)添加一系列的統(tǒng)計(jì)功能,遇到很多需要按條件計(jì)數(shù)的情況。嘗試了幾種方法,下面簡要記錄,供大家參考。

問題描述

為使討論簡單易懂,我將問題稍作簡化,去掉諸多的背景。

從前有一個(gè)皇帝,他有50個(gè)妃子,這些妃子很沒有天理的給他生了100,000個(gè)兒子,于是,皇帝很苦惱,海量的兒子很難管理,而且,他想知道每個(gè)妃子給他生了多少個(gè)兒子,從而論功行賞,這很難辦。于是,皇帝請(qǐng)了一個(gè)程序員幫他編了一個(gè)程序,用數(shù)據(jù)庫來存儲(chǔ)所有的兒子的信息,這樣就可以用程序來統(tǒng)計(jì)和管理啦。

數(shù)據(jù)庫的結(jié)構(gòu)如下:

id 皇子的唯一編號(hào)
mother 皇子母親的唯一編號(hào)

皇帝把妃子分成了兩個(gè)等級(jí),天宮娘娘(編號(hào)小于25)和地宮娘娘(編號(hào)大于等于25),他想知道天宮娘娘們和地宮娘娘們的生育能力孰強(qiáng)孰弱。于是,程序員開始寫SQL Query了。

方法1:使用GROUP BY

SQL Query

SELECT COUNT(*) FROM `prince` GROUP BY `mother` > 24;

執(zhí)行結(jié)果

count(*)
50029
49971

在100,000行數(shù)據(jù)上的運(yùn)行時(shí)間:0.0335 秒

分析

這種GROUP BY方法的最大問題在于:無法區(qū)分所得到的結(jié)果。這兩個(gè)數(shù)字哪一個(gè)是天宮娘娘們所生的皇子數(shù),哪一個(gè)是地宮娘娘們所生的皇子數(shù)呢?不知道。所以,盡管它統(tǒng)計(jì)出了總數(shù),但是沒有什么意義。

因此,為了區(qū)分統(tǒng)計(jì)結(jié)果,必須要把條件 mother > 24 也作為一個(gè)字段在結(jié)果集中作為一個(gè)字段體現(xiàn)出來,修改后的sql如下:

SELECT COUNT(*) AS `number`, `mother` > 24 AS `type` FROM `prince` GROUP BY `mother` > 24;

執(zhí)行結(jié)果

number type
50029 0
49971 1

條件表達(dá)式作為字段時(shí),該字段的值就是該條件表達(dá)式的值,因此,對(duì)應(yīng)我們的例子,type = 1 也就是表示 mother > 24 的值為1,因此,第二行中的數(shù)字代表地宮娘娘們所生的皇子數(shù)。

經(jīng)過修改后,我們看出,天宮娘娘們略勝一籌。

優(yōu)缺點(diǎn)

缺點(diǎn)是顯而易見的,由于使用了條件表達(dá)式作為分組依據(jù),它只能做二元的劃分,對(duì)于要分成多類進(jìn)行統(tǒng)計(jì)的情況不能夠勝任。比如要分別統(tǒng)計(jì)1~10號(hào)、11~24號(hào),25號(hào)~50號(hào)妃子的產(chǎn)子數(shù),就無法實(shí)現(xiàn)了。

另外,由于使用了GROUP BY,因此涉及到排序,執(zhí)行時(shí)間上要更長。

我暫時(shí)沒有發(fā)現(xiàn)這種方法的優(yōu)點(diǎn)。

方法2:使用嵌套的SELECT

使用嵌套的SELECT也可以達(dá)到目的,在每個(gè)SELECT子句中統(tǒng)計(jì)一個(gè)條件下的數(shù)據(jù),然后用一個(gè)主SELECT把這些統(tǒng)計(jì)數(shù)據(jù)整合起來。

SQL Query

SELECT 
  ( SELECT COUNT( * ) FROM `prince` WHERE `mother` >24 ) AS `digong`, 
  ( SELECT COUNT( * ) FROM `prince` WHERE `mother` <=24 ) AS `tiangong`

執(zhí)行結(jié)果

digong tiangong
49971 50029

在100,000行數(shù)據(jù)上的運(yùn)行時(shí)間:0.0216 秒

分析

這種嵌套SELECT的方法非常直觀,就是分別統(tǒng)計(jì)各個(gè)條件下的數(shù)值,最后進(jìn)行匯總,通俗易懂,跟自然語言沒啥區(qū)別了。

優(yōu)缺點(diǎn)

優(yōu)點(diǎn)就是直觀,而且速度也比GROUP BY要快。雖然是3條SELECT語句,看起來比GROUP BY的方案多了2條語句,但是它不涉及到排序,這就節(jié)省了很多時(shí)間。

缺點(diǎn)可能就是語句稍多,對(duì)語句數(shù)量有潔癖的同學(xué)可能會(huì)比較不舒服。

方法3:使用CASE WHEN

CASE WHEN語句的功能很強(qiáng)大,可以定義靈活的查詢條件,很適合進(jìn)行分類統(tǒng)計(jì)。

SQL Query

SELECT 
  COUNT( CASE WHEN `mother` >24 THEN 1 ELSE NULL END ) AS `digong`, 
  COUNT( CASE WHEN `mother` <=24 THEN 1 ELSE NULL END ) AS `tiangong`
FROM prince

執(zhí)行結(jié)果

digong tiangong
49971 50029

在100,000行數(shù)據(jù)上的運(yùn)行時(shí)間:0.02365825 秒

分析

此方法的關(guān)鍵在于

COUNT( CASE WHEN `mother` >24 THEN 1 ELSE NULL END )

這里的COUNT和CASE WHEN聯(lián)合使用,做到了分類計(jì)數(shù)。先使用CASE WHEN,當(dāng)滿足條件時(shí),將字段值設(shè)置為 1, 不滿足條件時(shí),將字段值設(shè)置為NULL,接著COUNT函數(shù)僅對(duì)非NULL字段進(jìn)行計(jì)數(shù),于是,問題解決。

優(yōu)缺點(diǎn)

優(yōu)點(diǎn)嘛,此方法也不涉及到排序,因此運(yùn)行時(shí)間上與方法2相當(dāng),SELECT語句減少到了 1 條。

缺點(diǎn)就是語句比較長,對(duì)語句長度有潔癖的同學(xué)可能會(huì)比較不舒服。

總結(jié)

對(duì)于確定分類的按條件計(jì)數(shù),可以盡量不用GROUP BY,從而避免排序動(dòng)作,加速Q(mào)uery的執(zhí)行。

如果需要根據(jù)某個(gè)字段的值進(jìn)行分類,而該字段的值是可變的,比如皇帝要統(tǒng)計(jì)每一個(gè)妃子的產(chǎn)子數(shù),而他可能不停的再娶很多妃子,這種情況下,使用方法2和方法3就不太靈光了,還是使用一個(gè)GROUP BY來得簡單便捷。

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • mySQL占用虛擬內(nèi)存達(dá)8百多兆問題解決思路

    mySQL占用虛擬內(nèi)存達(dá)8百多兆問題解決思路

    為了裝mysql環(huán)境測試,裝上后發(fā)現(xiàn)啟動(dòng)后mysql占用了很大的虛擬內(nèi)存,達(dá)8百多兆,需要的朋友可以參考下
    2012-12-12
  • 淺談MySQL如何優(yōu)雅的做大表刪除

    淺談MySQL如何優(yōu)雅的做大表刪除

    這篇文章主要介紹了淺談MySQL如何優(yōu)雅的做大表刪除,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • MySQL 數(shù)據(jù)庫雙向鏡像、循環(huán)鏡像(復(fù)制)

    MySQL 數(shù)據(jù)庫雙向鏡像、循環(huán)鏡像(復(fù)制)

    在MySQL數(shù)據(jù)庫鏡像的貼子中,主數(shù)據(jù)庫A 的數(shù)據(jù)鏡像到從數(shù)據(jù)庫B,是單向的,Zen Cart網(wǎng)店的數(shù)據(jù)讀寫都必須在數(shù)據(jù)庫A進(jìn)行,結(jié)果會(huì)自動(dòng)鏡像到數(shù)據(jù)庫B中。但是對(duì)數(shù)據(jù)庫B的直接操作,不會(huì)影響數(shù)據(jù)庫A。
    2011-05-05
  • MySql用DATE_FORMAT截取DateTime字段的日期值

    MySql用DATE_FORMAT截取DateTime字段的日期值

    MySql截取DateTime字段的日期值可以使用DATE_FORMAT來格式化,使用方法如下
    2014-08-08
  • mysql5.7中的密碼忘記如何找回

    mysql5.7中的密碼忘記如何找回

    這篇文章主要介紹了mysql5.7中的密碼忘記如何找回問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 淺談mysql哪些情況會(huì)導(dǎo)致索引失效

    淺談mysql哪些情況會(huì)導(dǎo)致索引失效

    索引在我們使用MySQL數(shù)據(jù)庫時(shí)可以極大的提高查詢效率,然而,有時(shí)候因?yàn)槭褂蒙系囊恍╄Υ镁蜁?huì)導(dǎo)致索引的失效,無法達(dá)到我們使用索引的預(yù)期效果,本文就介紹一下幾種索引失效的方法
    2021-11-11
  • MySQL使用聚合函數(shù)進(jìn)行單表查詢

    MySQL使用聚合函數(shù)進(jìn)行單表查詢

    這篇文章主要介紹了MySQL使用聚合函數(shù)進(jìn)行單表查詢,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 詳解Mysql之mysqlbackup備份與恢復(fù)實(shí)踐

    詳解Mysql之mysqlbackup備份與恢復(fù)實(shí)踐

    這篇文章主要介紹了詳解Mysql之mysqlbackup備份與恢復(fù)實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • MySQL使用UUID_SHORT()的問題解決

    MySQL使用UUID_SHORT()的問題解決

    MySQL的UUID_SHORT()函數(shù)是一個(gè)用于生成短UUID的函數(shù),該函數(shù)返回一個(gè)64位的整數(shù),可以用于唯一標(biāo)識(shí)一條數(shù)據(jù)記錄,本文介紹了MySQL使用UUID_SHORT()的問題解決,感興趣的可以了解一下
    2023-08-08
  • MySQL并行DDL的實(shí)現(xiàn)方法

    MySQL并行DDL的實(shí)現(xiàn)方法

    本文詳細(xì)介紹了MySQL8.0.27并行DDL的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-10-10

最新評(píng)論

宾川县| 长沙县| 安泽县| 伊金霍洛旗| 松滋市| 龙泉市| 仙游县| 洞头县| 乐昌市| 华宁县| 宜兰市| 新泰市| 凉山| 松江区| 汝城县| 绥江县| 永川市| 乐都县| 长武县| 新邵县| 鹿邑县| 嘉祥县| 类乌齐县| 绥滨县| 子洲县| 德安县| 融水| 青海省| 绥阳县| 桓台县| 张家口市| 萨迦县| 灌云县| 囊谦县| 改则县| 阿坝| 建平县| 台东县| 甘德县| 长武县| 苗栗县|