GROUP BY關鍵字能夠將查詢結果按照某個字段或多個字段進行分組。字段中值相等的爲一組。基本的語法格式以下:函數
GROUP BY 屬性名 [HAVING 條件表達式] [WITH ROLLUP]
GROUP BY關鍵字能夠和GROUP_CONCAT()函數一塊兒使用。GROUP_CONCAT()函數會把每一個分組中指定的字段值都顯示出來。.net
同時,GROUP BY關鍵字一般與集合函數一塊兒使用。集合函數包括COUNT()函數、SUM()函數、AVG()函數、MAX()函數和MIN()函數等。get
若是GROUP BY不與上述函數一塊兒使用,那麼查詢結果就是字段取值的分組狀況。字段中取值相同的記錄爲一組,可是隻顯示該組的第一條記錄。it
若是單獨使用GROUP BY關鍵字,查詢結果只顯示一個分組的一條記錄。class
實例:將employee表的sex字段進行分組查詢,將查詢結果與分組前的結果進行對比。操做步驟以下:語法
1. 首先執行不帶GROUP BY關鍵字的SELECT語句。以下圖所示:im
上圖中代碼執行的結果顯示的是employee表中原始的記錄狀況。統計
2. 執行帶有GROUP BY關鍵字的SELECT語句。代碼以下:數據
SELECT * FROM employee GROUP BY sex;
在DOS提示符窗口中查看執行帶有GROUP BY關鍵字的SELECT語句的操做效果。以下圖所示:查詢
上圖中代碼執行的結果只顯示了兩條記錄。這兩條記錄的sex字段的值分別爲「女」和「男」。
查詢結果進行比較,GROUP BY關鍵字只顯示每一個分組的一條記錄。這說明,GROUP BY關鍵字單獨使用時,只能查詢出每一個分組的一條記錄,這樣作的意義不大。所以,通常在使用集合函數時才使用GROUP BY關鍵字。
GROUP BY關鍵字與GROUP_CONCAT()函數一塊兒使用時,每一個分組中指定的字段值會所有顯示出來。
實例:將employee表按照sex字段進行分組查詢。使用GROUP_CONCAT()函數將每一個分組的name字段的值顯示出來。
SELECT語句的代碼以下:
SELECT sex,GROUP_CONCAT(name) FROM employee GROUP BY sex;
在DOS提示符窗口中查看代碼的執行效果。以下圖所示:
上圖中代碼執行的結果顯示,查詢結果分爲兩組。sex字段取值爲「女」的記錄是一組,取值爲「男」的記錄是一組。每一組中全部人的名字都被查詢出來了。
該實例說明,使用GROUP_CONCAT()函數能夠很好的把分組狀況表示出來。
GROUP BY關鍵字與集合函數一塊兒使用時,能夠經過集合函數計算分組中的總記錄、最大值、最小值等。
實例:將employee表的sex字段進行分組查詢。sex字段取值相同的爲一組。而後對每一組使用集合函數COUNT()函數進行計算,求出每一組的記錄數。
SELECT語句的代碼以下:
SELECT sex,COUNT(sex) FROM employee GROUP BY sex;
在DOS提示符窗口中查看GROUP BY關鍵字與集合函數一塊兒使用的操做效果。以下圖所示:
上圖中代碼執行的結果顯示,查詢結果按sex字段的取值進行分組。取值爲「女」的記錄爲一組,取值爲「男」的記錄爲一組。COUNT(sex)計算出了sex字段不一樣分組的記錄數。第一組共有2條記錄,第二組共有3條記錄。
一般狀況下,GROUP BY關鍵字與集合函數一塊兒使用,先使用GROUP BY關鍵字將記錄分組,而後每組都使用集合函數進行計算。在統計時常常須要使用GROUP BY關鍵字和集合函數。
使用GROUP BY關鍵字時,若是加上「HAVING 條件表達式」,則能夠限制輸出的結果。只有符合條件表達式的結果纔會顯示。
實例:將employee表的sex字段進行分組查詢。而後顯示記錄數大於等於3的分組。
SELECT語句的代碼以下:
SELECT sex,COUNT(sex) FROM employee GROUP BY sex HAVING COUNT(sex)>=3;
在DOS提示符窗口中查看GROUP BY關鍵字與HAVING一塊兒使用的操做效果。以下圖所示:
上圖中代碼執行的結果只顯示了取值爲「男」的記錄的狀況。由於,該分組的記錄數爲3,恰好符合HAVING COUNT(sex)>=3的條件。
該實例說明,「HAVING 條件表達式」能夠限制查詢結果的顯示狀況。
「HAVING 條件表達式」與「WHERE 條件表達式」都是用於限制顯示的。可是,二者起做用的地方不同。
在MySQL中,還能夠按照多個字段進行分組。例如,employee表按照d_id字段和sex字段進行分組。分組過程當中,先按照d_id字段進行分組,遇到d_id字段的值相等的狀況時,再把d_id值相等的記錄按照sex字段進行分組。
實例:將employee表按照d_id字段和sex字段進行分組。
SELECT語句的代碼以下:
SELECT * FROM employee GROUP BY d_id,sex;
在DOS提示符窗口中查看按照多個字段進行分組的操做效果。以下圖所示:
上圖中代碼執行的結果顯示,記錄先按照d_id字段進行分組,由於分別有兩條記錄的d_id的值爲1001和1004,因此這4條記錄再次按照sex字段的取值進行了分組。
使用WITH ROLLUP時,將會在全部記錄的最後加上一條記錄。這條記錄是上面全部記錄的總和。
實例:將employee表的sex字段進行分組查詢。使用COUNT()函數計算每組的記錄數,而且加上WITH ROLLUP。
SELECT語句的代碼以下:
SELECT sex,COUNT(sex) FROM employee GROUP BY sex WITH ROLLUP;
在DOS提示符窗口中查看GROUP BY關鍵字與WITH ROLLUP一塊兒使用的操做效果。以下圖所示:
上圖中代碼執行的結果顯示,計算出了各個分組的記錄數,而且,在記錄的最後加上了一條新的記錄。該記錄的COUNT(sex)列的值正好是上面分組的值的總和。
實例:將employee表的sex字段進行分組查詢。使用GROUP_CONCAT()函數查看每組的name字段的值,而且加上WITH ROLLUP。
SELECT語句的代碼以下:
SELECT sex,GROUP_CONCAT(name) FROM employee GROUP BY sex WITH ROLLUP;
在DOS提示符窗口中查看SELECT語句WITH ROLLUP參數的操做效果。以下圖所示:
上圖中代碼執行的結果顯示,GROUP_CONCAT(name)顯示了每一個分組的name字段的值。同時,最後一條記錄的GROUP_CONCAT(name)列的值正好是上面分組name取值的總和。