萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> mysql GROUP BY 函數 教程

mysql GROUP BY 函數 教程

GROUP BY(聚合)函數 本章論述了用於一組數值操作的 group (集合)函數。除非另作說明, group 函數會忽略 NULL 值。 假如你在一個不包含 ROUP BY子句的語句中使用一個 group函數 ,它相當於對所有行進行分組。

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。

 

copyright © 萬盛學電腦網 all rights reserved