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


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

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

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

GROUP BY關鍵字可以和GROUP_CONCAT()函數一起使用。GROUP_CONCAT()函數會把每個分組中指定的字段值都顯示出來。

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

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

如果GROUP BY不與上述函數一起使用,那么查詢結果就是字段取值的分組情況。字段中取值相同的記錄為一組,但是只顯示該組的第一條記錄。


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

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

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

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

執行不帶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取值的總和。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM