MySQL 5.7 聚合(GROUP BY)功能描述
轉(zhuǎn)載自??MySQL 5.7 ?聚合(GROUP BY)功能描述
12.19.1聚合(GROUP BY)功能描述
本節(jié)介紹對值集合進(jìn)行操作的組(聚合)函數(shù)。
表12.25聚合(GROUP BY)函數(shù)
| AVG() | 返回參數(shù)的平均值 |
| BIT_AND() | 按位返回AND |
| BIT_OR() | 按位返回OR |
| BIT_XOR() | 按位返回異或 |
| COUNT() | 返回返回的行數(shù) |
| COUNT(DISTINCT) | 返回許多不同值的計數(shù) |
| GROUP_CONCAT() | 返回一個連接的字符串 |
| JSON_ARRAYAGG() | 將結(jié)果集作為單個JSON數(shù)組返回 |
| JSON_OBJECTAGG() | 將結(jié)果集作為單個JSON對象返回 |
| MAX() | 返回最大值 |
| MIN() | 返回最小值 |
| STD() | 返回人口標(biāo)準(zhǔn)差 |
| STDDEV() | 返回人口標(biāo)準(zhǔn)差 |
| STDDEV_POP() | 返回人口標(biāo)準(zhǔn)差 |
| STDDEV_SAMP() | 返回樣本標(biāo)準(zhǔn)差 |
| SUM() | 歸還總和 |
| VAR_POP() | 返回人口標(biāo)準(zhǔn)差異 |
| VAR_SAMP() | 返回樣本方差 |
| VARIANCE() | 返回人口標(biāo)準(zhǔn)差異 |
?
除非另有說明,否則組函數(shù)會忽略?NULL值。
如果在包含無GROUP BY子句的語句中使用組函數(shù)?,則它等同于對所有行進(jìn)行分組。有關(guān)更多信息,請參見?第12.19.3節(jié)“GROUP BY的MySQL處理”。
對于數(shù)字參數(shù),方差和標(biāo)準(zhǔn)差函數(shù)返回一個DOUBLE值。的SUM()和?AVG()函數(shù)返回一個?DECIMAL為準(zhǔn)確值參數(shù)(整數(shù)或值DECIMAL),以及DOUBLE為近似值參數(shù)(值FLOAT或?DOUBLE)。
在SUM()和?AVG()聚合函數(shù)不具有時間價值的工作。(它們將值轉(zhuǎn)換為數(shù)字,在第一個非數(shù)字字符后丟失所有內(nèi)容。)要解決此問題,請轉(zhuǎn)換為數(shù)字單位,執(zhí)行聚合操作,然后轉(zhuǎn)換回時間值。例子:
SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(time_col))) FROM tbl_name; SELECT FROM_DAYS(SUM(TO_DAYS(date_col))) FROM tbl_name;如果需要,?諸如SUM()或?AVG()期望數(shù)字參數(shù)的函數(shù)將參數(shù)強(qiáng)制轉(zhuǎn)換為數(shù)字。對于?SET或?ENUM值,強(qiáng)制轉(zhuǎn)換操作會導(dǎo)致使用基礎(chǔ)數(shù)值。
的BIT_AND(),?BIT_OR()和?BIT_XOR()聚合函數(shù)執(zhí)行位操作。它們需要?BIGINT(64位整數(shù))參數(shù)并返回BIGINT值。其他類型的參數(shù)將轉(zhuǎn)換為?BIGINT可能發(fā)生截斷。有關(guān)在MySQL 8.0的變化,允許位操作采取二進(jìn)制字符串類型參數(shù)(信息BINARY,?VARBINARY和?BLOB類型),見?12.12節(jié),“位函數(shù)和操作符”。
-
AVG([DISTINCT]?expr)
返回的平均值?expr。該?DISTINCT選項可用于返回不同值的平均值?expr。
如果沒有匹配的行,則?AVG()返回?NULL。
SELECT student_name, AVG(test_score)FROM studentGROUP BY student_name; -
BIT_AND(expr)
返回AND所有位的按位?expr。計算以64位(BIGINT)精度執(zhí)行。
如果沒有匹配的行,則?BIT_AND()返回中性值(所有位設(shè)置為1)。
-
BIT_OR(expr)
返回OR所有位的按位?expr。計算以64位(BIGINT)精度執(zhí)行。
如果沒有匹配的行,則?BIT_OR()返回中性值(所有位都設(shè)置為0)。
-
BIT_XOR(expr)
返回XOR所有位的按位expr。計算以64位(BIGINT)精度執(zhí)行。
如果沒有匹配的行,則?BIT_XOR()返回中性值(所有位都設(shè)置為0)。
-
COUNT(expr)
返回?語句檢索的行中非NULL?值數(shù)的計數(shù)。結(jié)果是一個?值。?exprSELECTBIGINT
如果沒有匹配的行,則?COUNT()返回?0。
SELECT student.student_name,COUNT(*)FROM student,courseWHERE student.student_id=course.student_idGROUP BY student_name;COUNT(*)有點不同,它返回檢索的行數(shù)的計數(shù),無論它們是否包含?NULL值。
對于事務(wù)存儲引擎,例如?InnoDB,存儲精確的行數(shù)是有問題的。多個交易可能同時發(fā)生,每個交易都可能影響計數(shù)。
InnoDB不保留表中的內(nèi)部行數(shù),因為并發(fā)事務(wù)可能同時?“?看到?”不同數(shù)量的行。因此,SELECT COUNT(*)?語句只計算當(dāng)前事務(wù)可見的行。
在MySQL 5.7.18之前,通過掃描聚簇索引來InnoDB處理?SELECT COUNT(*)語句。從MySQL 5.7.18開始,?通過遍歷最小的可用二級索引來InnoDB處理SELECT COUNT(*)語句,除非索引或優(yōu)化器提示指示優(yōu)化器使用不同的索引。如果不存在輔助索引,則掃描聚簇索引。
SELECT COUNT(*)如果索引記錄不完??全在緩沖池中,則?處理語句需要一些時間。為了更快地計算,請創(chuàng)建一個計數(shù)器表,讓應(yīng)用程序根據(jù)插入和刪除更新它。但是,在數(shù)千個并發(fā)事務(wù)正在啟動對同一計數(shù)器表的更新的情況下,此方法可能無法很好地擴(kuò)展。如果大概行數(shù)足夠,請使用?SHOW TABLE STATUS。
InnoDB?以相同的方式處理SELECT COUNT(*)和SELECT COUNT(1)操作。沒有性能差異。
對于MyISAM表,COUNT(*)如果SELECT從一個表檢索,沒有檢索到其他列,并且沒有?WHERE子句,?則優(yōu)化為非常快速地返回?。例如:
SELECT COUNT(*) FROM student;此優(yōu)化僅適用于MyISAM?表,因為為此存儲引擎存儲了精確的行數(shù),并且可以非??焖俚卦L問。?COUNT(1)如果第一列定義為,則僅受相同優(yōu)化的影響NOT NULL。
-
COUNT(DISTINCT?expr,[expr...])
返回具有不同非NULL?expr?值的行數(shù)。
如果沒有匹配的行,則?COUNT(DISTINCT)返回?0。
SELECT COUNT(DISTINCT results) FROM student;在MySQL中,您可以NULL通過提供表達(dá)式列表來獲取不包含的不同表達(dá)式組合的數(shù)量。在標(biāo)準(zhǔn)SQL中,您必須對內(nèi)部的所有表達(dá)式進(jìn)行連接?COUNT(DISTINCT ...)。
-
GROUP_CONCAT(expr)
此函數(shù)返回字符串結(jié)果,其中NULL包含來自組的連接非值。NULL如果沒有非NULL值,則返回?。完整語法如下:
GROUP_CONCAT([DISTINCT] expr [,expr ...][ORDER BY {unsigned_integer | col_name | expr}[ASC | DESC] [,col_name ...]][SEPARATOR str_val]) SELECT student_name, GROUP_CONCAT(test_score) FROM student GROUP BY student_name;要么:
SELECT student_name, GROUP_CONCAT(DISTINCT test_score ORDER BY test_score DESC SEPARATOR ' ') FROM student GROUP BY student_name;在MySQL中,您可以獲得表達(dá)式組合的連接值。要消除重復(fù)值,請使用該?DISTINCT子句。要對結(jié)果中的值進(jìn)行排序,請使用該ORDER BY子句。要按相反順序排序,請將DESC?(descending)關(guān)鍵字添加到要在ORDER BY子句中排序的列的名稱中。默認(rèn)為升序;?這可以使用ASC關(guān)鍵字明確指定。組中值之間的默認(rèn)分隔符是逗號(,)。要明確指定分隔符,請使用SEPARATOR后跟應(yīng)在組值之間插入的字符串文字值。要完全消除分隔符,請指定?SEPARATOR ''。
結(jié)果被截斷為group_concat_max_len?系統(tǒng)變量給出的最大長度,其默認(rèn)值為1024.盡管返回值的有效最大長度受值的約束,但該值可以設(shè)置得更高max_allowed_packet。group_concat_max_len在運(yùn)行時更改值的語法?如下,其中val?是無符號整數(shù):
SET [GLOBAL | SESSION] group_concat_max_len = val;返回值是非二進(jìn)制或二進(jìn)制字符串,具體取決于參數(shù)是非二進(jìn)制還是二進(jìn)制字符串。結(jié)果類型是TEXT或者?BLOB除非?group_concat_max_len小于或等于512,在這種情況下結(jié)果類型是?VARCHAR或?VARBINARY。
另見CONCAT()和?CONCAT_WS():?第12.5節(jié)“字符串函數(shù)”。
-
JSON_ARRAYAGG(col_or_expr)
將結(jié)果集聚合為單個?JSON數(shù)組,其元素由行組成。此數(shù)組中元素的順序未定義。該函數(shù)作用于計算為單個值的列或表達(dá)式。返回?NULL如果結(jié)果不包含任何行,或在錯誤的事件。
mysql> SELECT o_id, attribute, value FROM t3; +------+-----------+-------+ | o_id | attribute | value | +------+-----------+-------+ | 2 | color | red | | 2 | fabric | silk | | 3 | color | green | | 3 | shape | square| +------+-----------+-------+ 4 rows in set (0.00 sec)mysql> SELECT o_id, JSON_ARRAYAGG(attribute) AS attributes > FROM t3 GROUP BY o_id; +------+---------------------+ | o_id | attributes | +------+---------------------+ | 2 | ["color", "fabric"] | | 3 | ["color", "shape"] | +------+---------------------+ 2 rows in set (0.00 sec)在MySQL 5.7.22中添加。
-
JSON_OBJECTAGG(key,?value)
將兩個列名或表達(dá)式作為參數(shù),第一個用作鍵,第二個用作值,并返回包含鍵值對的JSON對象。返回NULL如果結(jié)果不包含任何行,或在錯誤的事件。如果任何鍵名稱NULL或參數(shù)數(shù)量不等于2,則會發(fā)生錯誤。
mysql> SELECT o_id, attribute, value FROM t3; +------+-----------+-------+ | o_id | attribute | value | +------+-----------+-------+ | 2 | color | red | | 2 | fabric | silk | | 3 | color | green | | 3 | shape | square| +------+-----------+-------+ 4 rows in set (0.00 sec)mysql> SELECT o_id, JSON_OBJECTAGG(attribute, value) FROM t3 GROUP BY o_id; +------+----------------------------------------+ | o_id | JSON_OBJECTAGG(attribute, name) | +------+----------------------------------------+ | 2 | {"color": "red", "fabric": "silk"} | | 3 | {"color": "green", "shape": "square"} | +------+----------------------------------------+ 1 row in set (0.00 sec)在MySQL 5.7.22中添加。
-
MAX([DISTINCT]?expr)
返回的最大值?expr。?MAX()可以采用字符串參數(shù);?在這種情況下,它返回最大字符串值。請參見第8.3.1節(jié)“MySQL如何使用索引”。的?DISTINCT關(guān)鍵字可用于以找到最大的不同值中的?expr,然而,這產(chǎn)生相同的結(jié)果作為遺漏DISTINCT。
如果沒有匹配的行,則?MAX()返回?NULL。
SELECT student_name, MIN(test_score), MAX(test_score)FROM studentGROUP BY student_name;因為MAX(),MySQL當(dāng)前按字符串值比較ENUM和?SET列,而不是字符串在集合中的相對位置。這與ORDER BY?比較它們的方式不同。
-
MIN([DISTINCT]?expr)
返回的最小值?expr。?MIN()可以采用字符串參數(shù);?在這種情況下,它返回最小字符串值。請參見第8.3.1節(jié)“MySQL如何使用索引”。的?DISTINCT關(guān)鍵字可用來找到最小的不同值中的?expr,然而,這產(chǎn)生相同的結(jié)果作為遺漏DISTINCT。
如果沒有匹配的行,則?MIN()返回?NULL。
SELECT student_name, MIN(test_score), MAX(test_score)FROM studentGROUP BY student_name;因為MIN(),MySQL當(dāng)前按字符串值比較ENUM和?SET列,而不是字符串在集合中的相對位置。這與ORDER BY?比較它們的方式不同。
-
STD(expr)
返回總體的人口標(biāo)準(zhǔn)差?expr。?STD()是標(biāo)準(zhǔn)SQL函數(shù)的同義詞?STDDEV_POP(),作為MySQL擴(kuò)展提供。
如果沒有匹配的行,則?STD()返回?NULL。
-
STDDEV(expr)
返回總體的人口標(biāo)準(zhǔn)差?expr。?STDDEV()是STDDEV_POP()與Oracle兼容的標(biāo)準(zhǔn)SQL函數(shù)的同義詞?。
如果沒有匹配的行,則?STDDEV()返回?NULL。
-
STDDEV_POP(expr)
返回expr(平方根?VAR_POP())的總體標(biāo)準(zhǔn)差?。您也可以使用?STD()或?STDDEV(),它們是等效的但不是標(biāo)準(zhǔn)的SQL。
如果沒有匹配的行,則?STDDEV_POP()返回?NULL。
-
STDDEV_SAMP(expr)
返回樣本標(biāo)準(zhǔn)差?expr(的平方根)?VAR_SAMP()。
如果沒有匹配的行,則?STDDEV_SAMP()返回?NULL。
-
SUM([DISTINCT]?expr)
返回的總和expr。如果返回集沒有行,則SUM()?返回NULL。的?DISTINCT關(guān)鍵字可用來僅求和的不同的值expr。
如果沒有匹配的行,則?SUM()返回?NULL。
-
VAR_POP(expr)
返回人口標(biāo)準(zhǔn)方差?expr。它將行視為整個總體,而不是作為樣本,因此它將行數(shù)作為分母。您也可以使用?VARIANCE(),這是等效的但不是標(biāo)準(zhǔn)SQL。
如果沒有匹配的行,則?VAR_POP()返回?NULL。
-
VAR_SAMP(expr)
返回樣本方差?expr。也就是說,分母是行數(shù)減1。
如果沒有匹配的行,則?VAR_SAMP()返回?NULL。
-
VARIANCE(expr)
返回人口標(biāo)準(zhǔn)方差?expr。?VARIANCE()是標(biāo)準(zhǔn)SQL函數(shù)的同義詞?VAR_POP(),作為MySQL擴(kuò)展提供。
如果沒有匹配的行,則?VARIANCE()返回?NULL。
總結(jié)
以上是生活随笔為你收集整理的MySQL 5.7 聚合(GROUP BY)功能描述的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 萤火虫的习性 萤火虫的习性是什么
- 下一篇: MySQL存储引擎中MyISAM和Inn