#进阶5:分组函数
/*
说明:分组函数往往用于实现将一组数据进行统计计算,最终得到一个值,有称为聚合函数或统计函数
分组函数清单
sun(字段名):求和
avg(字段名):求平均数
max(字段名):求最大值
min(字段名):求最小值
count(字段名):计算非空字段值的个数
*/
#案例1:查询员工信息表中,所有员工的工资和,工资平均值,最低工资,最高工资,有工资的个数
      SELECT SUM(`salary`),AVG(`salary`),MIN(`salary`),MAX(`salary`),COUNT(`salary`) FROM `employees`;
#案例2:添加筛选条件
#1、查询emp表中的记录数
       SELECT COUNT(`employee_id`) FROM `employees`;
#2、查询emp表中有佣金的人数
       SELECT COUNT(`salary`) FROM `employees`;     #10进行
#3、查询emp表中月薪大于25000的人数
       SELECT COUNT(`salary`) FROM `employees` WHERE `salary`>25000;   
#4、查询有领导的人数
      SELECT COUNT(`manager_id`) FROM `employees`;
 
#count 的补充介绍
#1、统计结果集的行数,推荐使用count(*)
      SELECT COUNT(*) FROM `employees`;  #统计表的行数
      SELECT COUNT(1) FROM `employees`;  #统计表的行数,相当于加了一行,每行都是1,最后统计有多少个1
      SELECT COUNT('王金') FROM `employees`;  ##统计表的行数,相当于加了一行,每行都是‘王金’,最后统计有多少个‘王金’
      SELECT COUNT(*) FROM `employees` WHERE `department_id`=30;
#2、搭配distinct实现去重的统计
#需求:查询有员工的部门个数
      SELECT COUNT(DISTINCT `department_id`) FROM `employees`;    
 
#分组查询(GROUP BY)
#案例:每个部门的总工资、平均工资?
    SELECT SUM(`salary`),`department_id`
    FROM `employees`
   GROUP BY `department_id`;
   SELECT AVG(`salary`),`department_id`
   FROM `employees`
  GROUP BY `department_id`;   
分组查询
  /*
   语法:
   select 查询列表
   from 表名
   where 分组前的筛选条件
   group by 分组列表
   having 分组后筛选
   order by 排序列表
执行顺序
  (1)from
  (2)where
  (3)group by
  (4)having
  (5)select
  (6)order by
特点
    1、查询列表往往是 分组函数和被分组的字段
    2、分组查询中的筛选分为两类
                                  筛选的基表             使用的关键词           位置
      分组前筛选           原始表                         where               group by的前面
      分组后筛选           分组后的结果集           having              group by的后面
      where——group by——having
     分组函数(count(*),max()等)做条件只可能放在 having 后面!!!
  */
#1、简单查询
#案例1:查询每个工种的员工平均工资
    SELECT AVG(`salary`),`job_id`
    FROM `employees`
    GROUP BY `job_id`;
#案例2:查询每个领导的手下人数
    SELECT COUNT(*),`manager_id`
    FROM `employees`
    WHERE `manager_id` IS NOT NULL
    GROUP BY `manager_id`;
#2、可以实现分组的筛选
#案例1:查询邮箱中包含a字符的 每个部门的最高工资
     SELECT MAX(`salary`) 最高工资,`department_id`,`email`
     FROM `employees`
     WHERE `email` LIKE '%a%'
      GROUP BY `department_id`;
#案例2:查询每个领导手下有奖金的员工的平均工资
     SELECT AVG(`salary`),`manager_id`
     FROM `employees`
     WHERE `commission_pct` IS NOT NULL
    GROUP BY `manager_id`;
#3、可以实现分组后的筛选
#案例1:查询哪个部门的员工个数>5
#分析1:查询每个部门的员工个数
     SELECT COUNT(*) 员工个数,`department_id`
     FROM `employees`
    GROUP BY `department_id`;
#分析2:在刚才结果的基础上,筛选哪个部门的员工人数>5
     SELECT COUNT(*) 员工个数,`department_id`
     FROM `employees`
     GROUP BY `department_id`
     HAVING COUNT(*)>5;
#案例2:每个工种有奖金的员工的最高工资>12000得工种编号和最高工资
      SELECT `job_id`,MAX(`salary`)
      FROM `employees`
     WHERE `commission_pct` IS NOT NULL
     GROUP BY `job_id`
     HAVING MAX(`salary`)>12000;
#案例3:领导编号>120 的每个领导手下的最低工资 大于5000的最低工资
      SELECT MIN(`salary`) 最低工资,`manager_id`
      FROM `employees`
      WHERE `manager_id`>102
     GROUP BY `manager_id`
     HAVING MIN(`salary`)>5000;
#4、可以实现排序
#案例:每个工种有奖学金的员工的最高工资>6000的工种编号和最高工资,按最高工资升序
     SELECT MAX(`salary`) 最高工资,`job_id`
     FROM `employees`
     WHERE `commission_pct` IS NOT NULL
     GROUP BY `job_id`
     HAVING MAX(`salary`)>6000
     ORDER BY MAX(`salary`) ASC;
#5、按多个字段分组
#案例:查询每个工种每个部门的最低工资,并按最低工资降序(提示:工种和部门都一样,才是一组)
       工种     部门     工资
        1        10       10000
        1        20       2000
        2        20
        3        20
       1        10
        2        30
        2        20
       SELECT MIN(`salary`) 最低工资,`job_id`,`department_id`
      FROM `employees`
      GROUP BY `job_id`,`department_id`
      ORDER BY MIN(`salary`) DESC;