Mysql使用聚合函數(shù)時需要注意事項
聚合函數(shù)
聚合函數(shù)作用于一組數(shù)據(jù),并對一組數(shù)據(jù)返回一個值。
常見的聚合函數(shù):SUM()
、MAX()
、MIN()
、AVG()
、COUNT()
對COUNT()聚合函數(shù)的更深一層理解
COUNT
函數(shù)的作用:計算指定字段在查詢結(jié)果中出現(xiàn)的個數(shù)(不包含NULL值)
如果計算表中有多少條記錄,如何實現(xiàn)?
方式1:COUNT(*)
方式2:COUNT(1)
方式3:COUNT(具體字段)
:不一定對!
為什么說使用方式3,得到的結(jié)果不一定正確呢?這是因為 COUNT
計算字段出現(xiàn)的個數(shù)時,是不計算NULL值的?;蛘哒f,COUNT(*)
會統(tǒng)計值為 NULL 的行,而 COUNT(字段)
不會統(tǒng)計此字段為 NULL 值的行
舉個栗子,需求:查詢公司中平均獎金率
SELECT SUM(commission_pct)/COUNT(commission_pct) FROM employees;
上面的 mysql 代碼 是錯誤的,因為 并不是所有的員工都有獎金率,可能存在沒有獎金的員工,他/她的commission_pct
字段的記錄為 NULL
。
正確的mysql語句如下:
SELECT SUM(commission_pct) / COUNT(IFNULL(commission_pct,0)), AVG(IFNULL(commission_pct,0)) FROM employees;
如何需要統(tǒng)計表中的記錄數(shù),使用COUNT(*)、COUNT(1)、COUNT(具體字段) 哪個效率更高呢?
如果使用的是 MyISAM
存儲引擎,則三者效率相同,都是O(1)
如果使用的是 InnoDB
存儲引擎,則三者效率:COUNT(*) = COUNT(1) > COUNT(字段)
GROUP BY 的一些鮮為人知的事兒
SELECT
中出現(xiàn)的非組函數(shù)的字段必須聲明在 GROUP BY
中。反而,在 GROUP BY
中聲明的字段可以不出現(xiàn)在SEELCT
中。
SELECT job_id,department_id,AVG(salary) FROM employees GROUP BY job_id,department_id;
GROUP BY
聲明在FROM
后面,WHERE
后面,ORDER BY
前面,LIMIT
前面。
當(dāng)使用ROLLUP時,不能同時使用ORDER BY子句進(jìn)行結(jié)果排序,即ROLLUP和ORDER BY是互相排斥的。
- HAVING 的小秘密 如果過濾條件中使用了聚合函數(shù),則必須使用
HAVING
來替換WHERE
,否則報錯。 HAVING
必須聲明在GROUP BY
的后面。- 在開發(fā)中,我們使用
HAVING
的前提是SQL
中使用了GROUP BY
SELECT department_id,MAX(salary) FROM employees GROUP BY department_id HAVING MAX(salary) > 10000;
當(dāng)過濾條件中沒有聚合函數(shù)時,則此過濾條件聲明在WHERE中或HAVING中都可以,但是建議大家聲明在WHERE中。
WHERE
與 HAVING
的對比
- 從適用范圍上來講,
HAVING
的適用范圍更廣。 - 如果過濾條件中沒有聚合函數(shù):這種情況下,
WHERE
的執(zhí)行效率要高于HAVING
SELECT查詢的結(jié)構(gòu)
方式1:
SELECT ...,....,... FROM ...,...,.... WHERE 多表的連接條件 AND 不包含組函數(shù)的過濾條件 GROUP BY ...,... HAVING 包含組函數(shù)的過濾條件 ORDER BY ... ASC/DESC LIMIT ...,...
方式2:
SELECT ...,....,... FROM ... JOIN ... ON 多表的連接條件 JOIN ... ON ... WHERE 不包含組函數(shù)的過濾條件 AND/OR 不包含組函數(shù)的過濾條件 GROUP BY ...,... HAVING 包含組函數(shù)的過濾條件 ORDER BY ... ASC/DESC LIMIT ...,...
其中:
(1)from:從哪些表中篩選 (2)on:關(guān)聯(lián)多表查詢時,去除笛卡爾積 (3)where:從表中篩選的條件 (4)group by:分組依據(jù) (5)having:在統(tǒng)計結(jié)果中再次篩選 (6)order by:排序 (7)limit:分頁
SELECT語句執(zhí)行順序
FROM -> WHERE -> GROUP BY -> HAVING -> SELECT 的字段 -> DISTINCT -> ORDER BY -> LIMIT
到此這篇關(guān)于Mysql使用聚合函數(shù)時需要注意事項的文章就介紹到這了,更多相關(guān)mysql聚合函數(shù)使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql sql語句性能調(diào)優(yōu)簡單實例
這篇文章主要介紹了 mysql sql語句性能調(diào)優(yōu)簡單實例的相關(guān)資料,需要的朋友可以參考下2017-06-06使用Canal監(jiān)聽MySQL Binlog日志的實現(xiàn)方案
本文檔探討了在分布式系統(tǒng)中處理超時未支付訂單的挑戰(zhàn)與解決方案,文檔還詳細(xì)介紹了MySQL Binlog的配置、Canal中間件的部署與配置,以及消息監(jiān)聽處理的實現(xiàn),確保了方案的可操作性,需要的朋友可以參考下2024-12-12如何使用mysql語句進(jìn)行多表聯(lián)查(以三個表為例)
這篇文章主要介紹了如何使用mysql語句進(jìn)行多表聯(lián)查(以三個表為例),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08mysql刪除重復(fù)記錄并且只保留一條的實現(xiàn)方法
本文主要介紹了mysql刪除重復(fù)記錄并且只保留一條的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01