MySQL對數據表進行分組查詢(GROUP BY)

MySQL對數據表進行分組查詢(GROUP BY)

GROUP BY關鍵字能夠將查詢結果按照某個字段或多個字段進行分組。字段中值相等的爲一組。基本的語法格式以下:函數

GROUP BY 屬性名 [HAVING 條件表達式] [WITH ROLLUP]
  • 屬性名:是指按照該字段的值進行分組。
  • HAVING 條件表達式:用來限制分組後的顯示,符合條件表達式的結果將被顯示。
  • WITH ROLLUP:將會在全部記錄的最後加上一條記錄。加上的這一條記錄是上面全部記錄的總和。

GROUP BY關鍵字能夠和GROUP_CONCAT()函數一塊兒使用。GROUP_CONCAT()函數會把每一個分組中指定的字段值都顯示出來。.net

同時,GROUP BY關鍵字一般與集合函數一塊兒使用。集合函數包括COUNT()函數、SUM()函數、AVG()函數、MAX()函數和MIN()函數等。get

  • COUNT()函數:用於統計記錄的條數。
  • SUM()函數:用於計算字段的值的總和。
  • AVG()函數:用於計算字段的值的平均值。
  • MAX()函數:用於查詢字段的最大值。
  • MIN()函數:用於查詢字段的最小值。

若是GROUP BY不與上述函數一塊兒使用,那麼查詢結果就是字段取值的分組狀況。字段中取值相同的記錄爲一組,可是隻顯示該組的第一條記錄。it


單獨使用GROUP BY關鍵字進行分組

若是單獨使用GROUP BY關鍵字,查詢結果只顯示一個分組的一條記錄。class

實例:將employee表的sex字段進行分組查詢,將查詢結果與分組前的結果進行對比。操做步驟以下:語法

1. 首先執行不帶GROUP BY關鍵字的SELECT語句。以下圖所示:im

執行不帶GROUP BY關鍵字的SELECT語句

上圖中代碼執行的結果顯示的是employee表中原始的記錄狀況。統計

2. 執行帶有GROUP BY關鍵字的SELECT語句。代碼以下:數據

SELECT * FROM employee GROUP BY sex;

在DOS提示符窗口中查看執行帶有GROUP BY關鍵字的SELECT語句的操做效果。以下圖所示:查詢

查看執行帶有GROUP BY關鍵字的SELECT語句的操做效果

上圖中代碼執行的結果只顯示了兩條記錄。這兩條記錄的sex字段的值分別爲「女」和「男」。

查詢結果進行比較,GROUP BY關鍵字只顯示每一個分組的一條記錄。這說明,GROUP BY關鍵字單獨使用時,只能查詢出每一個分組的一條記錄,這樣作的意義不大。所以,通常在使用集合函數時才使用GROUP BY關鍵字。


GROUP BY關鍵字與GROUP_CONCAT()函數一塊兒使用

GROUP BY關鍵字與GROUP_CONCAT()函數一塊兒使用時,每一個分組中指定的字段值會所有顯示出來。

實例:將employee表按照sex字段進行分組查詢。使用GROUP_CONCAT()函數將每一個分組的name字段的值顯示出來。

SELECT語句的代碼以下:

SELECT sex,GROUP_CONCAT(name) FROM employee GROUP BY sex;

在DOS提示符窗口中查看代碼的執行效果。以下圖所示:

GROUP BY關鍵字與GROUP_CONCAT()函數一塊兒使用的操做效果

上圖中代碼執行的結果顯示,查詢結果分爲兩組。sex字段取值爲「女」的記錄是一組,取值爲「男」的記錄是一組。每一組中全部人的名字都被查詢出來了。

該實例說明,使用GROUP_CONCAT()函數能夠很好的把分組狀況表示出來。


GROUP BY關鍵字與集合函數一塊兒使用

GROUP BY關鍵字與集合函數一塊兒使用時,能夠經過集合函數計算分組中的總記錄、最大值、最小值等。

實例:將employee表的sex字段進行分組查詢。sex字段取值相同的爲一組。而後對每一組使用集合函數COUNT()函數進行計算,求出每一組的記錄數。

SELECT語句的代碼以下:

SELECT sex,COUNT(sex) FROM employee GROUP BY sex;

在DOS提示符窗口中查看GROUP BY關鍵字與集合函數一塊兒使用的操做效果。以下圖所示:

查看GROUP BY關鍵字與集合函數一塊兒使用的操做效果

上圖中代碼執行的結果顯示,查詢結果按sex字段的取值進行分組。取值爲「女」的記錄爲一組,取值爲「男」的記錄爲一組。COUNT(sex)計算出了sex字段不一樣分組的記錄數。第一組共有2條記錄,第二組共有3條記錄。

提示

一般狀況下,GROUP BY關鍵字與集合函數一塊兒使用,先使用GROUP BY關鍵字將記錄分組,而後每組都使用集合函數進行計算。在統計時常常須要使用GROUP BY關鍵字和集合函數。


GROUP BY關鍵字與HAVING一塊兒使用

使用GROUP BY關鍵字時,若是加上「HAVING 條件表達式」,則能夠限制輸出的結果。只有符合條件表達式的結果纔會顯示。

實例:將employee表的sex字段進行分組查詢。而後顯示記錄數大於等於3的分組。

SELECT語句的代碼以下:

SELECT sex,COUNT(sex) FROM employee GROUP BY sex HAVING COUNT(sex)>=3;

在DOS提示符窗口中查看GROUP BY關鍵字與HAVING一塊兒使用的操做效果。以下圖所示:

查看GROUP BY關鍵字與HAVING一塊兒使用的操做效果

上圖中代碼執行的結果只顯示了取值爲「男」的記錄的狀況。由於,該分組的記錄數爲3,恰好符合HAVING COUNT(sex)>=3的條件。

該實例說明,「HAVING 條件表達式」能夠限制查詢結果的顯示狀況。

提示

「HAVING 條件表達式」與「WHERE 條件表達式」都是用於限制顯示的。可是,二者起做用的地方不同。

  • WHERE 條件表達式:做用於表或者視圖,是表和視圖的查詢條件。
  • HAVING 條件表達式:做用於分組後的記錄,用於選擇符合條件的組。

按照多個字段進行分組

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字段的取值進行了分組。


GROUP BY關鍵字與WITH ROLLUP一塊兒使用

使用WITH ROLLUP時,將會在全部記錄的最後加上一條記錄。這條記錄是上面全部記錄的總和。

實例:將employee表的sex字段進行分組查詢。使用COUNT()函數計算每組的記錄數,而且加上WITH ROLLUP。

SELECT語句的代碼以下:

SELECT sex,COUNT(sex) FROM employee GROUP BY sex WITH ROLLUP;

在DOS提示符窗口中查看GROUP BY關鍵字與WITH ROLLUP一塊兒使用的操做效果。以下圖所示:

查看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參數的操做效果。以下圖所示:

查看SELECT語句WITH ROLLUP參數的操做效果

上圖中代碼執行的結果顯示,GROUP_CONCAT(name)顯示了每一個分組的name字段的值。同時,最後一條記錄的GROUP_CONCAT(name)列的值正好是上面分組name取值的總和。

相關文章
相關標籤/搜索