top
Loading...
12.10.1.GROUPBY(聚合)函數
12.10.1. 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)

返回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() 返回NULLDISTINCT 關鍵詞可用于 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

作者:mysql.com
來源:http://dev.mysql.com/doc/refman/5.1/zh/functions.html
北斗有巢氏 有巢氏北斗