6. 分组函数

  分组函数又称为多行处理函数。
  多行处理函数的特点:输入多行,最终输出一行。
MySQL(六)—— 分组函数(多行处理函数)_数据库MySQL(六)—— 分组函数(多行处理函数)_字段_02
  注意:1. 分组函数在使用的时候必须先进行分组,然后才能用。如果没有对数据进行分组,整张表默认为一组。
     2. 分组函数自动忽略空值,不需要手动的加 where 条件排除空值。
       select count(*) from emp where xxx; 符合条件的所有记录总数。
       select count(comm) from emp; comm 这个字段中不为空的元素总数。

MySQL(六)—— 分组函数(多行处理函数)_数据库_03
     3. 分组函数不能直接使用在 where 关键字后面。
       select ename,sal from emp where sal > avg(sal);

MySQL(六)—— 分组函数(多行处理函数)_sql_04

6.1 count 计数

  • 取得所有的员工数:select count(*) from emp;

    MySQL(六)—— 分组函数(多行处理函数)_数据_05
    count(*)表示取得所有记录,忽略 null,为 null 的值也会取得。
  • 取得津贴不为 null 员工数:select count(comm) from emp;

    MySQL(六)—— 分组函数(多行处理函数)_分组函数_06
    采用 count(字段名称),不会取得为 null 的记录。

6.2 sum 求和

  sum 可以取得某一个列的和,null 会被忽略。

  • 计算工资和:select sum(sal) from emp;

    MySQL(六)—— 分组函数(多行处理函数)_分组函数_07
  • 计算津贴和:select sum(comm) from emp;

    MySQL(六)—— 分组函数(多行处理函数)_sql_08
    null 会被忽略。
  • 计算薪水的合计(sal+comm):select sum(sal+comm) from emp;

    MySQL(六)—— 分组函数(多行处理函数)_sql_09
    从以上结果来看,不正确,原因在于 comm 字段有 null 值,所以无法计算,sum 会忽略掉,正确的做法是将 comm 字段转换成 0。
    改为:select sum(sal+IFNULL(comm, 0)) from emp;

    MySQL(六)—— 分组函数(多行处理函数)_字段_10

6.3 avg 平均值

  • 计算平均工资: select avg(sal) from emp;

    MySQL(六)—— 分组函数(多行处理函数)_数据_11

6.4 max 最大值

  • 找出最高工资:select max(sal) from emp;

    MySQL(六)—— 分组函数(多行处理函数)_sql_12
  • 找出最晚入职的员工:select max(str_to_date(hiredate, '%Y-%m-%d')) from emp;

    MySQL(六)—— 分组函数(多行处理函数)_数据库_13

6.5 min 最小值

  • 找出最低工资:select min(sal) from emp;
    MySQL(六)—— 分组函数(多行处理函数)_分组函数_14
  • 找出最早入职的员工:select min(str_to_date(hiredate, '%Y-%m-%d')) from emp;

    MySQL(六)—— 分组函数(多行处理函数)_字段_15

6.6 分组函数在使用时需要注意的点

  第一点:分组函数自动忽略NULL,你不需要提前对NULL进行处理。

      select sum(comm) from emp;

MySQL(六)—— 分组函数(多行处理函数)_数据_16
      select count(comm) from emp;

MySQL(六)—— 分组函数(多行处理函数)_分组函数_17
      select avg(comm) from emp;

MySQL(六)—— 分组函数(多行处理函数)_数据_18
  第二点:分组函数中count(*)count(具体字段)有什么区别?
      count(*):统计表当中的总行数。(只要有一行数据count则++,因为每一行记录不可能都为NULL,一行数据中有一列不为NULL,则这行数据就是有效的。)
      count(具体字段):表示统计该字段下所有不为NULL的元素的总数。

      select count(*) from emp;

MySQL(六)—— 分组函数(多行处理函数)_分组函数_19
      select count(comm) from emp;

MySQL(六)—— 分组函数(多行处理函数)_sql_20
  第三点:分组函数不能够直接使用在where子句中。
      找出比最低工资高的员工信息:select ename,sal from emp where sal > min(sal);

MySQL(六)—— 分组函数(多行处理函数)_数据_21
      在where子句后使用分组函数,会出现错误。

  第四点:所有的分组函数可以组合起来一起用。
      select sum(sal),min(sal),max(sal),avg(sal),count(*) from emp;
MySQL(六)—— 分组函数(多行处理函数)_sql_22

6.7 组合聚合函数

 可以将这些聚合函数都放到 select 中一起使用:select count(*),sum(sal),avg(sal),max(sal),min(sal) from emp

MySQL(六)—— 分组函数(多行处理函数)_数据库_23