1. 程式人生 > >一步一步學MySQL----12 分組資料查詢

一步一步學MySQL----12 分組資料查詢

12.1 簡單分組查詢

語法:

select function() from table_name where condition group by field;

例如:

mysql> select * from employee group by depno; //按照部門號進行分組

這裡寫圖片描述

執行結果只顯示三條資料,原因是表employee中的欄位depno的值只有14,10,12三種,首先將所有資料按這三個值分成三組,然後再顯示每組中的一條記錄。

那麼,如果所針對的欄位沒有重複值將會發生什麼情況呢?

下面我們根據員工號(不重複)進行分組看一看

mysql> select * from employee group by empno;

這裡寫圖片描述

我們看到的執行結果是顯示所有資料記錄。

12.2 實現統計功能分組查詢

如果想顯示每個分組中的欄位,可以通過group_concat()來實現,該函式可以實現顯示每個分組中指定欄位值。
語法:

select group_concat(field) from table_name where condition group by field;

例如:要求按照部門號對所有員工進行分組,同時顯示每組中的員工姓名和每組中員工的個數。

mysql> select depno

, group_concat(ename) names from employee group by depno;
//該語句以關鍵字depno為分組依據,同時通過函式group_concat()獲取每組中所指定引數的記錄元素。

這裡寫圖片描述

執行結果顯示:分為三組,欄位depno為10的記錄為一組,depno為12的記錄為一組,depno為14的記錄為一組,同時通過函式group_concat()顯示出了每組中的員工的姓名。

mysql>select depno, group_concat(ename) names, count(ename) num from employee group by

depno;

這裡寫圖片描述

執行結果顯示:分為三組,同時通過函式group_concat()顯示出了每組中員工的姓名,同時通過函式count()統計每組中員工的人數。

12.3 實現多個欄位分組查詢

例如:要求首先按照部門號對所有員工進行分組,然後按照僱傭日期對每組進行分組,同時顯示每組中的員工姓名和員工人數。

mysql> select depno, Hiredate, group_concat(ename) names, count(ename) num from employee group by depno, Hiredate;

這裡寫圖片描述

執行結果顯示:分成了8組,同時還通過函式group_concat()和count()顯示了每組中員工的姓名和人數。

12.4 實現HAVING子句限定分組查詢

注意:在MySQL中,如果想實現對分組進行條件限制,決不能通過關鍵字where來實現,因為where關鍵字主要用來實現條件限制資料記錄。

為了解決上述問題,MySQL專門提供了關鍵字Having來實現條件限制分組資料記錄。

例如:要求首先按照部門號對所有員工進行分組,然後顯示平均工資高於3700的員工的姓名。

第一步:按照部門分組

mysql> select depno from employee group by depno;

這裡寫圖片描述

第二步:顯示每組的平均工資

mysql> select depno, avg(salary) from employee group by depno;

這裡寫圖片描述

第三步:執行having、group_concat()和count(),顯示出平均工資大於3700的每個分組中員工姓名和人數

mysql> select depno, avg(salary), group_concat(ename) names, count(ename) num from employee group by depno having avg(salary)>3700;

這裡寫圖片描述