在100,000行數據上的運行時間:0.0335 秒
這種GROUP BY方法的最大問題在于:無法區分所得到的結果。這兩個數字哪一個是天宮娘娘們所生的皇子數,哪一個是地宮娘娘們所生的皇子數呢?不知道。所以,盡管它統計出了總數,但是沒有什么意義。
因此,為了區分統計結果,必須要把條件 mother > 24 也作為一個字段在結果集中作為一個字段體現出來,修改后的sql如下:
執行結果
條件表達式作為字段時,該字段的值就是該條件表達式的值,因此,對應我們的例子,type = 1 也就是表示 mother > 24 的值為1,因此,第二行中的數字代表地宮娘娘們所生的皇子數。
經過修改后,我們看出,天宮娘娘們略勝一籌。
缺點是顯而易見的,由于使用了條件表達式作為分組依據,它只能做二元的劃分,對于要分成多類進行統計的情況不能夠勝任。比如要分別統計1~10號、11~24號,25號~50號妃子的產子數,就無法實現了。
另外,由于使用了GROUP BY,因此涉及到排序,執行時間上要更長。
我暫時沒有發現這種方法的優點。
使用嵌套的SELECT也可以達到目的,在每個SELECT子句中統計一個條件下的數據,然后用一個主SELECT把這些統計數據整合起來。
在100,000行數據上的運行時間:0.0216 秒
這種嵌套SELECT的方法非常直觀,就是分別統計各個條件下的數值,最后進行匯總,通俗易懂,跟自然語言沒啥區別了。
優點就是直觀,而且速度也比GROUP BY要快。雖然是3條SELECT語句,看起來比GROUP BY的方案多了2條語句,但是它不涉及到排序,這就節省了很多時間。
缺點可能就是語句稍多,對語句數量有潔癖的同學可能會比較不舒服。
CASE WHEN語句的功能很強大,可以定義靈活的查詢條件,很適合進行分類統計。
在100,000行數據上的運行時間:0.02365825 秒
此方法的關鍵在于
這里的COUNT和CASE WHEN聯合使用,做到了分類計數。先使用CASE WHEN,當滿足條件時,將字段值設置為 1, 不滿足條件時,將字段值設置為NULL,接著COUNT函數僅對非NULL字段進行計數,于是,問題解決。
優點嘛,此方法也不涉及到排序,因此運行時間上與方法2相當,SELECT語句減少到了 1 條。
缺點就是語句比較長,對語句長度有潔癖的同學可能會比較不舒服。
對于確定分類的按條件計數,可以盡量不用GROUP BY,從而避免排序動作,加速Query的執行。
如果需要根據某個字段的值進行分類,而該字段的值是可變的,比如皇帝要統計每一個妃子的產子數,而他可能不停的再娶很多妃子,這種情況下,使用方法2和方法3就不太靈光了,還是使用一個GROUP BY來得簡單便捷。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com