文章目录

  • 分组函数
  • 常见的分组函数
  • 分组函数使用时的注意事项
  • 1.分组函数自动忽略 null ,不需要我们对 null 进行处理
  • 2.分组函数中count(*)和count(字段)的区别
  • 3.分组函数不能直接使用在where子句中
  • 4.所有的分组函数可以组合使用
  • 分组查询
  • 1.SQL语句中关键字的执行顺序
  • 2.having关键字
  • distinct关键字



使用到的表


mysql中分组的个数 mysql中的分组函数_字段

分组函数

分组函数又叫聚合函数、多行处理函数,其特点是输入多行数据,最终输出一行结果。

常见的分组函数

count

取得记录数

sum

求和

avg

求平均值

max

取最大值

min

取最小值

需要注意的是,分组函数在使用时需要进行分组,然后才能使用。如果没有进行分组,将默认整张表为一组。

最低工资
select min(sal) from emp;
最高工资
select max(sal) from emp;
工资和
select sum(sal) from emp;
平均工资
select avg(sal) from emp;
员工数量
select count(ename) from emp;

mysql中分组的个数 mysql中的分组函数_字段_02


mysql中分组的个数 mysql中的分组函数_数据库_03

分组函数使用时的注意事项

1.分组函数自动忽略 null ,不需要我们对 null 进行处理

对 COMM 字段进行求和
select sum(comm) from emp;
统计COMM字段的数据总数
select count(comm) from emp;

数字和null相加得到的结果是null,但在这里,分组函数进行了对应的处理。

mysql中分组的个数 mysql中的分组函数_字段_04


字段值为null时,不进行统计

mysql中分组的个数 mysql中的分组函数_字段_05

2.分组函数中count(*)和count(字段)的区别

count(*):统计表的总行数,只要有一行数据,count就会加一,因为在一行数据中,不可能所有字段都为 null
count(字段):表示统计该字段下所有不为null的元素的总数

3.分组函数不能直接使用在where子句中

找出工资比最低工资高的员工的信息

select ename,sal from emp where sal>min(sal);
报错:ERROR 1111 (HY000): Invalid use of group function  无效的使用了分组函数

mysql中分组的个数 mysql中的分组函数_数据库_06

4.所有的分组函数可以组合使用

select sum(sal),min(sal),avg(sal),count(*) from emp;

mysql中分组的个数 mysql中的分组函数_数据库_07

分组查询

在实际应用中,我们可能需要查询某些特定的数据,需要先进行分组,然后对每一组数据进行操作。这时候就需要使用到分组查询。

select ... from ... group by ... ;

1.SQL语句中关键字的执行顺序

select
    ...
from
    ...
where
    ...
group by
    ...
order by
    ...

以上关键字的顺序不能颠倒,其执行顺序为:
    from
    where
    group by
    select
    order by

这时我们就能知道,为什么分组函数不能使用在where子句中。因为where执行时,还未进行group by分组,此时的分组函数还不能执行
而select sum(sal) from emp;之所以能执行,就是因为分组和分组函数的执行在select之前

查找每个工作岗位的工资和

select job,sum(sal) from emp group by job;

mysql中分组的个数 mysql中的分组函数_字段_08

查找每个部门的最高薪资,先按照部门编号进行分组,然后再找出每组中的最高薪资

select deptno,max(sal) from emp group by deptno;

mysql中分组的个数 mysql中的分组函数_分组函数_09


查找不同部门的不同岗位的最高薪资

select deptno,job,max(sal) from emp group by deptno,job;

mysql中分组的个数 mysql中的分组函数_mysql中分组的个数_10

2.having关键字

使用having可以对分完组之后的数据进行进一步过滤,having不能单独使用,其必须和group by一起使用,它也不能代替where。

查询每个部门的最高薪资,要求显示最高薪资大于3000的

select deptno,max(sal) from emp group by deptno having max(sal)>3000;
select deptno,max(sal) from emp where sal>3000 group by deptno;

mysql中分组的个数 mysql中的分组函数_数据库_11


mysql中分组的个数 mysql中的分组函数_分组函数_12

这里两个语句都能进行查询,应优先使用where

查询每个部门的平均薪资,并显示平均薪资大于2500的。这个时候使用having更加方便

select deptno,avg(sal) from emp group by deptno having avg(sal)>2500;

mysql中分组的个数 mysql中的分组函数_分组函数_13


加上having后的SQL中关键字的位置和执行顺序

select
    ... 
from
    ...
where
    ...
group by
    ...
having
    ...
order by
    ...

执行顺序:
from
where
group by
having
select
order by

distinct关键字

distinct关键字用于去除查询出的数据中的重复的内容

查询出所有的工作岗位并去除重复的

select distinct job from emp;

mysql中分组的个数 mysql中的分组函数_数据库_14

distinct只能使用在所有字段的最前方,表示一个或多个字段联合起来进行去除重复的数据
查询出不同部门的不同的岗位

select distinct deptno,job from emp;

mysql中分组的个数 mysql中的分组函数_数据库_15


可以看到,查询结果中在相同的部门中没有相同的岗位当没有使用到所有字段的最前方时会报错

mysql中分组的个数 mysql中的分组函数_分组函数_16


distinct还可以和分组函数联合使用

统计工作岗位的数量,在distinct关键字前使用分组函数

select count(distinct job) from emp;

mysql中分组的个数 mysql中的分组函数_mysql中分组的个数_17