Mysql分組以及聚合函式
- group by
group by語法可以根據給定欄位對查詢結果進行分組統計,相同屬性的資料為一個組。通常,在每組中通過聚合函式來可以計算組中最大,最小等。
如果group by帶有having,則只有滿足having後面的條件的組才能輸出。
注意: having 必須在group by之後。
-
與分組相關的聚合函式
count() 返回某個欄位的值的行數
max() 求最大某欄位最大的值
min() 求某欄位最小值
avg() 返回某欄位平均值
sum() 求某欄位總數group_concat() 將分組的結果拼接成字串
-
group by分組SQL語法
select 欄位 from 表名 where where條件 group by 分組條件 having having條件
order by 欄位 asc/desc limit offset, row
注意:
-
GROUP BY必須出現在WHERE 之後,ORDER BY 之前。
-
除聚集計算語句外,SELECT語句中的每個列都必須在GROUP BY中給出
//錯誤,由於name欄位沒有寫到group by之後
- 1
- 2
select count(id),name,sex from user group by sex;
//正確寫法
select count(id),name,sex from user group by sex,name;
備註:
group by 用於根據欄位進行分組
having 指定分組的搜尋條件,對分組的結果做進一步的處理
limit 顯示查詢出來的資料條數
-
例子
- 某個員工資訊表(staff)結構和資料如下:
id name dept salary edlevel hiredate
1 張三 開發部 2000 3 2009-10-11
2 李四 開發部 2500 3 2009-10-01
3 王五 設計部 2600 5 2010-10-02
4 王六 設計部 2300 4 2010-10-03
5 馬七 設計部 2100 4 2010-10-06
6 趙八 銷售部 3000 5 2010-10-05
7 錢九 銷售部 3100 7 2010-10-07
8 孫十 銷售部 3500 7 2010-10-06
//staff建表語句
create table staff( id int not null primary key auto_increment, name varchar(200) not null, dept varchar(50) not null comment '部門', salary float(15,2) comment '薪水', edlevel tinyint not null comment '等級', hiredate date not null comment '入職時間' )engine=innodb default charset=utf8; insert into staff(name,dept,salary,edlevel,hiredate) values('張三','開發部',2000,3,'2009-10-11'); insert into staff(name,dept,salary,edlevel,hiredate) values('李四','開發部',2500,3,'2009-10-01'); insert into staff(name,dept,salary,edlevel,hiredate) values('王五','設計部',2600,5,'2010-10-02'); insert into staff(name,dept,salary,edlevel,hiredate) values('王六','設計部',2300,4,'2010-10-03'); insert into staff(name,dept,salary,edlevel,hiredate) values('馬七','設計部',2100,4,'2010-10-06'); insert into staff(name,dept,salary,edlevel,hiredate) values('趙八','銷售部',3000,5,'2010-10-05'); insert into staff(name,dept,salary,edlevel,hiredate) values('錢九','銷售部',3100,7,'2010-10-07'); insert into staff(name,dept,salary,edlevel,hiredate) values('孫十','銷售部',3500,7,'2010-10-06');
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
聚合函式的簡單使用
-
求公司總人數
select count(id) from staff;
- 1
- 2
-
求公司薪水支出
select sum(salary) from staff;
- 1
- 2
-
求公司最高薪水
select max(salary) from staff;
- 1
- 2
-
求公司最低薪水
select min(salary) from staff;
- 1
- 2
-
求公司平均薪水
select avg(salary) from staff;
- 1
- 2
分組與聚合函式結合使用例子
例如,統計出各個部門的員工人數
select count(*) from staff group by dept;
- 1
- 2
- group_concat函式與group by結合使用例子
求: 得到每個部門的員工的名字
select dept,group_concat(name) from staff group by dept;
- 1
- 2
例如,列出每個部門最高薪水的結果,sql語句如下:
SELECT dept, MAX(SALARY) FROM staff GROUP BY dept
- 1
- 2
查詢結果如下:
dept MAXIMUM
開發部 2500
設計部 2600
銷售部 3500
-
查詢每個部門的總薪水數
select dept, sum(salary) as total from staff group by dept;
- 1
- 2
查詢結果如下:
dept total
開發部 4500
設計部 7000
銷售部 9600 -
將where字句與group by 子句一起使用
注意: 必須在group by之前指定where
例子: 查詢公司2010年之後入職的各個部門每個級別裡的最高薪水
SELECT DEPT, EDLEVEL, MAX( SALARY ) AS MAXIMUM
FROM staff
WHERE HIREDATE > '2010-01-01'
GROUP BY DEPT, EDLEVEL;
- 1
- 2
- 3
- 4
- 5
查詢結果如下:
DEPT EDLEVEL MAXIMUM
設計部 4 2300
設計部 5 2600
銷售部 5 3000
銷售部 7 3500
- 在GROUP BY子句之後使用HAVING子句
可應用限定條件進行分組,以便系統僅對滿足條件的組返回結果。為此,在GROUP BY子句後面包含一個HAVING子句。HAVING子句可包含一個或多個用AND和OR連線的謂詞。
例如:尋找僱員數超過2個的部門的最高和最低薪水:
SELECT DEPT, MAX( salary ) AS MAXIMUM, MIN( salary ) AS MINIMUM
FROM staff
GROUP BY DEPT
HAVING COUNT( * ) >2;
- 1
- 2
- 3
- 4
- 5
查詢結果如下:
DEPT MAXIMUM MINIMUM
設計部 2600 2100
銷售部 3500 3000
例如:尋找僱員平均工資大於3000的部門的最高和最低薪水:
select max(salary),min(salary),dept from staff group by dept having avg(salary) > 3000;
- 1
- 2
查詢結果如下:
DEPT MAXIMUM MINIMUM
銷售部 3500 3000