1. 程式人生 > >Mysql分組以及聚合函式

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

    注意:

    1. GROUP BY必須出現在WHERE 之後,ORDER BY 之前。

    2. 除聚集計算語句外,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 顯示查詢出來的資料條數

例子

  1. 某個員工資訊表(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

聚合函式的簡單使用

  1. 求公司總人數

    select count(id) from staff;
    
    • 1
    • 2
  2. 求公司薪水支出

    select sum(salary) from staff;
    
    • 1
    • 2
  3. 求公司最高薪水

    select max(salary) from staff;
    
    • 1
    • 2
  4. 求公司最低薪水

    select min(salary) from staff;
    
    • 1
    • 2
  5. 求公司平均薪水

    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

  1. 查詢每個部門的總薪水數

    select dept, sum(salary) as total from staff group by dept;
    
    • 1
    • 2

    查詢結果如下:

    dept total 
    開發部 4500 
    設計部 7000 
    銷售部 9600

  2. 將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

  1. 在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