Mysql中的group by用法解析

group by即分组查询,请各位同学务必掌握好,面试必备!

下面看案例

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

1. 列出每个部门最高薪水的结果

SELECT DEPT, MAX(SALARY) AS MAXIMUM
FROM STAFF
GROUP BY DEPT
DEPT MAXIMUM
开发部 2500
设计部 2600
销售部 3500

2. 查询每个部门的总的薪水数

SELECT DEPT, sum( SALARY ) AS total
FROM STAFF
GROUP BY DEPT
DEPT total
开发部 4500
设计部 7000
销售部 9600

3. WHEREGROUP BY一起使用

SELECT DEPT, EDLEVEL, MAX( SALARY ) AS MAXIMUM
FROM staff
WHERE HIREDATE > '2010-01-01'
GROUP BY DEPT, EDLEVEL
ORDER BY DEPT, EDLEVEL
DEPT EDLEVEL MAXIMUM
设计部 4 2300
设计部 5 2600
销售部 5 3000
销售部 7 3500

4. 在GROUP BY之后使用HAVING

寻找雇员数超过2个的部门的最高和最低薪水:

SELECT DEPT, MAX( SALARY ) AS MAXIMUM, MIN( SALARY ) AS MINIMUM
FROM staff
GROUP BY DEPT
HAVING COUNT(*) >2
ORDER BY DEPT
DEPT MAXIMUM MINIMUM
设计部 2600 2100
销售部 3500 3000

寻找雇员平均工资大于3000的部门的最高和最低薪水:

SELECT DEPT, MAX( SALARY ) AS MAXIMUM, MIN( SALARY ) AS MINIMUM
FROM staff
GROUP BY DEPT
HAVING AVG( SALARY ) >3000
ORDER BY DEPT
DEPT MAXIMUM MINIMUM
销售部 3500 3000

5. havingwhere的区别

注意: havingwhere 都是用来筛选的 having筛选组where筛选记录

  1. 分组筛选的时候 用having
  2. 其它情况用where

having就一定要和group by连用, 用group by不一有having(它只是一个筛选条件用的)