GROUP BY(聚合)函數
本章論述了用於一組數值操作的 group (集合)函數。除非另作說明, group 函數會忽略 NULL 值。
假如你在一個不包含 ROUP BY子句的語句中使用一個 group函數 ,它相當於對所有行進行分組。
AVG([DISTINCT] expr)
返回expr 的平均值。 DISTINCT 選項可用於返回 expr的不同值的平均值。
若找不到匹配的行,則AVG()返回 NULL 。
mysql> SELECT student_name, AVG(test_score)
-> FROM student
-> GROUP BY student_name;
BIT_AND(expr) www.111cn.net
返回expr中所有比特的 bitwise AND 。計算執行的精確度為64比特(BIGINT) 。
若找不到匹配的行,則這個函數返回 18446744073709551615 。(這是無符號 BIGINT 值,所有比特被設置為 1)。
BIT_OR(expr)
返回expr 中所有比特的bitwise OR。計算執行的精確度為64比特(BIGINT) 。
若找不到匹配的行,則函數返回 0 。
BIT_XOR(expr)
返回expr 中所有比特的bitwise XOR。計算執行的精確度為64比特(BIGINT) 。
若找不到匹配的行,則函數返回 0 。
COUNT(expr)
返回SELECT語句檢索到的行中非NULL值的數目。
若找不到匹配的行,則COUNT() 返回 0 。
mysql> SELECT student.student_name,COUNT(*)
-> FROM student,course
-> WHERE student.student_id=course.student_id
-> GROUP BY student_name;
COUNT(*) 的稍微不同之處在於,它返回檢索行的數目, 不論其是否包含 NULL值。
SELECT 從一個表中檢索,而不檢索其它的列,並且沒有 WHERE子句時, COUNT(*)被優化到最快的返回速度。例如:
mysql> SELECT COUNT(*) FROM student;
這個優化僅適用於 MyISAM表, 原因是這些表類型會儲存一個函數返回記錄的精確數量,而且非常容易訪問。對於事務型的存儲引擎(InnoDB, BDB), 存儲一個精確行數的問題比較多,原因是可能會發生多重事物處理, 而每個都可能會對行數產生影響。
COUNT(DISTINCT expr,[expr...])
返回不同的非NULL值數目。
若找不到匹配的項,則COUNT(DISTINCT)返回 0 。
mysql> SELECT COUNT(DISTINCT results) FROM student;
在MySQL中, 你通過給定一個表達式列表而獲取不包含NULL 不同表達式組合的數目。在標准 SQL中,你將必須在COUNT(DISTINCT ...)中連接所有表達式。
GROUP_CONCAT(expr)
該函數返回帶有來自一個組的連接的非NULL值的字符串結果。其完整的語法如下所示:
GROUP_CONCAT([DISTINCT] expr [,expr ...]
[ORDER BY {unsigned_integer | col_name | expr}
[ASC | DESC] [,col_name ...]]
[SEPARATOR str_val])
mysql> SELECT student_name,
-> GROUP_CONCAT(test_score)
-> FROM student
-> GROUP BY student_name;
Or:
mysql> SELECT student_name,
-> GROUP_CONCAT(DISTINCT test_score
-> ORDER BY test_score DESC SEPARATOR ' ')
-> FROM student
-> GROUP BY student_name;
在MySQL中,你可以獲取表達式組合的連接值。你可以使用DISTINCT刪去重復值。假若你希望多結果值進行排序,則應該使用 ORDER BY子句。若要按相反順序排列,將 DESC (遞減) 關鍵詞添加到你要用ORDER BY 子句進行排序的列名稱中。默認順序為升序;可使用ASC將其明確指定。 SEPARATOR 後面跟隨應該被插入結果的值中間的字符串值。默認為逗號 (‘,’)。通過指定SEPARATOR '' ,你可以刪除所有分隔符。
使用group_concat_max_len系統變量,你可以設置允許的最大長度。 程序中進行這項操作的語法如下,其中 val 是一個無符號整數:
SET [SESSION | GLOBAL] group_concat_max_len = val;
若已經設置了最大長度, 則結果被截至這個最大長度。
MIN([DISTINCT] expr), MAX([DISTINCT] expr)
返回expr 的最小值和最大值。 MIN() 和 MAX() 的取值可以是一個字符串參數;在這些情況下, 它們返回最小或最大字符串值。請參見7.4.5節,“MySQL如何使用索引”。 DISTINCT關鍵詞可以被用來查找expr 的不同值的最小或最大值,然而,這產生的結果與省略DISTINCT 的結果相同。
若找不到匹配的行,MIN()和MAX()返回 NULL 。
mysql> SELECT student_name, MIN(test_score), MAX(test_score)
-> FROM student
-> GROUP BY student_name;
對於MIN()、 MAX()和其它集合函數, MySQL當前按照它們的字符串值而非字符串在集合中的相關位置比較 ENUM和 SET 列。這同ORDER BY比較二者的方式有所不同。這一點應該在MySQL的未來版本中得到改善。
STD(expr) STDDEV(expr)
返回expr 的總體標准偏差。這是標准 SQL 的延伸。這個函數的STDDEV() 形式用來提供和Oracle 的兼容性。可使用標准SQL函數 STDDEV_POP() 進行代替。
若找不到匹配的行,則這些函數返回 NULL 。
STDDEV_POP(expr)
返回expr 的總體標准偏差(VAR_POP()的平方根)。你也可以使用 STD() 或STDDEV(), 它們具有相同的意義,然而不是標准的 SQL。
若找不到匹配的行,則STDDEV_POP()返回 NULL。
STDDEV_SAMP(expr)
返回expr 的樣本標准差 ( VAR_SAMP()的平方根)。
若找不到匹配的行,則STDDEV_SAMP() 返回 NULL 。
SUM([DISTINCT] expr)
返回expr 的總數。 若返回集合中無任何行,則 SUM() 返回NULL。DISTINCT 關鍵詞可用於 MySQL 5.1 中,求得expr 不同值的總和。
若找不到匹配的行,則SUM()返回 NULL。
VAR_POP(expr)
返回expr 總體標准方差。它將行視為總體,而不是一個樣本, 所以它將行數作為分母。你也可以使用 VARIANCE(),它具有相同的意義然而不是 標准的 SQL。
若找不到匹配的項,則VAR_POP()返回NULL。
VAR_SAMP(expr)
返回expr 的樣本方差。更確切的說,分母的數字是行數減去1。
若找不到匹配的行,則VAR_SAMP()返回NULL。
VARIANCE(expr)
返回expr 的總體標准方差。這是標准SQL 的延伸。可使用標准SQL 函數 VAR_POP() 進行代替。
若找不到匹配的項,則VARIANCE()返回NULL。