MySQL中的分组函数和分组查询

本文详细介绍了SQL中的分组函数,包括count、sum、avg、max和min的用法及注意事项,如分组函数忽略null、count(*)与count(字段)的区别,以及分组函数不能直接在where子句中使用。同时,阐述了分组查询的概念,使用groupby和having关键字进行数据过滤,以及distinct关键字在去除重复数据中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


使用到的表
在这里插入图片描述

分组函数

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

常见的分组函数

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;

在这里插入图片描述
在这里插入图片描述

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

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

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

数字和null相加得到的结果是null,但在这里,分组函数进行了对应的处理。在这里插入图片描述
字段值为null时,不进行统计
在这里插入图片描述

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  无效的使用了分组函数

在这里插入图片描述

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

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

在这里插入图片描述

分组查询

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

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;

在这里插入图片描述

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

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

在这里插入图片描述
查找不同部门的不同岗位的最高薪资

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

在这里插入图片描述

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;

在这里插入图片描述
在这里插入图片描述

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

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

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

在这里插入图片描述
加上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;

在这里插入图片描述

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

select distinct deptno,job from emp;

在这里插入图片描述
可以看到,查询结果中在相同的部门中没有相同的岗位

当没有使用到所有字段的最前方时会报错
在这里插入图片描述
distinct还可以和分组函数联合使用

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

select count(distinct job) from emp;

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值