mysql 數(shù)據(jù)匯總與分組
我們經(jīng)常需要匯總數(shù)據(jù)而不用把它們實(shí)際檢索出來,為此MySQL
提供了專門的函數(shù)。使用這些函數(shù),MySQL
查詢可用于檢索數(shù)據(jù),以便分析和報(bào)表生成。
這種類型的檢索例子有以下幾種:
- 確定表中行數(shù)(或者滿足某個(gè)條件或包含某個(gè)特定值的行數(shù))。
- 獲得表中行組的和。
- 找出表列(或所有行或某些特定的行)的最大值、最小值和平均值
如:
AVG() 返回某列的平均值 COUNT() 返回某列的行數(shù) MAX() 返回某列的最大值 MIN() 返回某列的最小值 SUM() 返回某列值之和
舉個(gè)例子:
select AVG(prod_price) as avg_price from products
再比如說:
這里有些函數(shù)里面可以設(shè)置distinct
,比如avg
,如果設(shè)置了的話,那么會(huì)有一個(gè)這樣的現(xiàn)象。就是只統(tǒng)計(jì)了不同值之間的平均值,具體看業(yè)務(wù)需求。
下面介紹分組數(shù)據(jù):
返回每個(gè)供應(yīng)商提供的產(chǎn)品數(shù)目:
select COUNT(*) as num_prods,vend_id from products GROUP BY vend_id
使用group by
需要注意的地方:
GROUP BY
子句可以包含任意數(shù)目的列。這使得能對(duì)分組進(jìn)行嵌套,為數(shù)據(jù)分組提供更細(xì)致的控制- 如果在
GROUP BY子
句中嵌套了分組,數(shù)據(jù)將在最后規(guī)定的分組上進(jìn)行匯總。換句話說,在建立分組時(shí),指定的所有列都一起計(jì)算(所以不能從個(gè)別的列取回?cái)?shù)據(jù)) GROUP BY
子句中列出的每個(gè)列都必須是檢索列或有效的表達(dá)式(但不能是聚集函數(shù))。如果在SELECT
中使用表達(dá)式,則必須在GROUP BY
子句中指定相同的表達(dá)式。不能使用別名。- 除聚集計(jì)算語(yǔ)句外,
SELECT
語(yǔ)句中的每個(gè)列都必須在GROUP BY
子句中給出。 - 如果分組列中具有NULL值,則
NULL
將作為一個(gè)分組返回。如果列中有多行NULL值,它們將分為一組。 GROUP BY
子句必須出現(xiàn)在WHERE子句之后,ORDER BY子句之前。
使用ROLLUP
使用WITH ROLLUP
關(guān)鍵字,可以得到每個(gè)分組以
及每個(gè)分組匯總級(jí)別(針對(duì)每個(gè)分組)的值,
如下所示:
select COUNT(*) as num_prods,vend_id from products GROUP BY vend_id with ROLLUP
除了能用GROUP BY
分組數(shù)據(jù)外,MySQL
還允許過濾分組,規(guī)定包括哪些分組,排除哪些分組。例如,可能想要列出至少有兩個(gè)訂單的所有顧客。為得出這種數(shù)據(jù),必須基于完整的分組而不是個(gè)別的行進(jìn)行過濾。
HAVING
和WHERE
的差別 這里有另一種理解方法,WHERE
在數(shù)據(jù)分組前進(jìn)行過濾,HAVING
在數(shù)據(jù)分組后進(jìn)行過濾。這是一個(gè)重要的區(qū)別,WHERE排除的行不包括在分組中。這可能會(huì)改變計(jì)算值,從而影響HAVING
子句中基于這些值過濾掉的分組。
select COUNT(*) as num_prods,vend_id from products GROUP BY vend_id HAVING COUNT(*)>2
那么,有沒有在一條語(yǔ)句中同時(shí)使用WHERE
和HAVING
子句的需要呢?事實(shí)上,確實(shí)有。假如想進(jìn)一步過濾上面的語(yǔ)句,使它返回過去12個(gè)月內(nèi)具有兩個(gè)以上訂單的顧客。為達(dá)到這一點(diǎn),可增加一條WHERE
子句,過濾出過去12個(gè)月內(nèi)下過的訂單。然后再增加HAVING
子句過濾出具有兩個(gè)
以上訂單的分組。
select COUNT(*) as num_prods,vend_id from products where prod_price>=10 GROUP BY vend_id
下面介紹一下order by
:
雖然GROUP BY
和ORDER BY
經(jīng)常完成相同的工作,但它們是非常不同的。
這里為什么說group by
與 order by
完成相同的工作呢?這是因?yàn)榍懊嫖覀儼l(fā)現(xiàn)沒,就是其實(shí)看起來好像是經(jīng)過了vend_id的排序的。
我們經(jīng)常發(fā)現(xiàn)用GROUP BY
分組的數(shù)據(jù)確實(shí)是以分組順序輸出的。但情況并不總是這樣,它并不是SQL規(guī)范所要求的。此外,用戶也可能會(huì)要求以不同于分組的順序排序。僅因?yàn)槟阋阅撤N方式分組數(shù)據(jù)(獲得特定的分組聚集值),并不表示你需要以相同的方式排序輸出。
應(yīng)該提供明確的ORDER BY
子句,即使其效果等同于GROUP BY
子句也是如此
不要忘記ORDER BY
一般在使用GROUP BY
子句時(shí),應(yīng)該也給出ORDER BY
子句。這是保證數(shù)據(jù)正確排序的唯一方法。千萬(wàn)不要僅依賴GROUP BY
排序數(shù)據(jù)。
例如:
select COUNT(*) as num_prods,vend_id from products where prod_price>=10 GROUP BY vend_id ORDER BY num_prods
select 語(yǔ)句順序:
SELECT 要返回的列或表達(dá)式 是 FROM 從中檢索數(shù)據(jù)的表 僅在從表選擇數(shù)據(jù)時(shí)使用 WHERE 行級(jí)過濾 否 GROUP BY 分組說明 僅在按組計(jì)算聚集時(shí)使用 HAVING 組級(jí)過濾 否 ORDER BY 輸出排序順序 否 LIMIT 要檢索的行數(shù) 否
到此這篇關(guān)于mysql
數(shù)據(jù)匯總與分組的文章就介紹到這了,更多相關(guān)mysql
分組內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Mysql關(guān)于數(shù)據(jù)庫(kù)是否應(yīng)該使用外鍵約束詳解說明
- 為什么MySQL 刪除表數(shù)據(jù) 磁盤空間還一直被占用
- 深入解析MySQL索引數(shù)據(jù)結(jié)構(gòu)
- MySQL必備基礎(chǔ)之分組函數(shù) 聚合函數(shù) 分組查詢?cè)斀?/a>
- mysql按照時(shí)間分組查詢的語(yǔ)句
- MySQL數(shù)據(jù)庫(kù)分組查詢group by語(yǔ)句詳解
- MySQL連表查詢分組去重的實(shí)現(xiàn)示例
- MySQL 分組查詢的優(yōu)化方法
- MySQL group by對(duì)單字分組序和多字段分組的方法講解
相關(guān)文章
MySQL Packet for query is too large 問題及解決方法
這篇文章主要介紹了MySQL Packet for query is too large 問題及解決方法,需要的朋友可以參考下2018-05-05SQL實(shí)現(xiàn)數(shù)據(jù)過濾流程詳解
這篇文章主要介紹了SQL實(shí)現(xiàn)數(shù)據(jù)過濾流程,當(dāng)我們?cè)赟QL中查詢數(shù)據(jù)時(shí),肯定是有一些數(shù)據(jù)是我們不需要的,所以我們此時(shí)就要對(duì)數(shù)據(jù)進(jìn)行過濾,以篩選出我們僅需要的數(shù)據(jù)2023-01-01Mysql實(shí)現(xiàn)簡(jiǎn)易版搜索引擎的示例代碼
前段時(shí)間,因?yàn)轫?xiàng)目需求,需要根據(jù)關(guān)鍵詞搜索聊天記錄,所以本文實(shí)現(xiàn)了Mysql實(shí)現(xiàn)簡(jiǎn)易版搜索引擎,具有一定的參考價(jià)值,感興趣的可以了解一下2021-08-08