一步一步學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;