当前位置: 代码网 > it编程>数据库>Mysql > Mysql使用聚合函数时需要注意事项

Mysql使用聚合函数时需要注意事项

2024年08月01日 Mysql 我要评论
聚合函数聚合函数作用于一组数据,并对一组数据返回一个值。常见的聚合函数:sum()、max()、min()、avg()、count()对count()聚合函数的更深一层理解count函数的作用:计算指

聚合函数

聚合函数作用于一组数据,并对一组数据返回一个值。
常见的聚合函数:sum()max()min()avg()count()

对count()聚合函数的更深一层理解

count函数的作用:计算指定字段在查询结果中出现的个数(不包含null值)

如果计算表中有多少条记录,如何实现?

方式1:count(*)
方式2:count(1)
方式3:count(具体字段):不一定对!
为什么说使用方式3,得到的结果不一定正确呢?这是因为 count 计算字段出现的个数时,是不计算null值的。或者说,count(*)会统计值为 null 的行,而 count(字段)不会统计此字段为 null 值的行

举个栗子,需求:查询公司中平均奖金率

select  sum(commission_pct)/count(commission_pct)
from employees;

上面的 mysql 代码 是错误的,因为 并不是所有的员工都有奖金率,可能存在没有奖金的员工,他/她的commission_pct字段的记录为 null
正确的mysql语句如下:

select sum(commission_pct) / count(ifnull(commission_pct,0)), avg(ifnull(commission_pct,0))
from employees;

如何需要统计表中的记录数,使用count(*)、count(1)、count(具体字段) 哪个效率更高呢?

如果使用的是 myisam 存储引擎,则三者效率相同,都是o(1)
如果使用的是 innodb 存储引擎,则三者效率:count(*) = count(1) > count(字段)

group by 的一些鲜为人知的事儿

select 中出现的非组函数的字段必须声明在 group by 中。反而,在 group by 中声明的字段可以不出现在seelct中。

select job_id,department_id,avg(salary)
from employees
group by job_id,department_id;

group by声明在from后面,where后面,order by前面,limit前面。

当使用rollup时,不能同时使用order by子句进行结果排序,即rollup和order by是互相排斥的。

  • having 的小秘密 如果过滤条件中使用了聚合函数,则必须使用 having 来替换 where,否则报错。
  • having 必须声明在 group by 的后面。
  • 在开发中,我们使用having的前提是 sql 中使用了 group by
select department_id,max(salary)
from employees
group by department_id
having max(salary) > 10000;

当过滤条件中没有聚合函数时,则此过滤条件声明在where中或having中都可以,但是建议大家声明在where中。

wherehaving 的对比

  • 从适用范围上来讲,having的适用范围更广。
  • 如果过滤条件中没有聚合函数:这种情况下,where的执行效率要高于having

select查询的结构

方式1:

select ...,....,...
 from ...,...,....
 where 多表的连接条件
and 不包含组函数的过滤条件
group by ...,...
 having 包含组函数的过滤条件
order by ... asc/desc
 limit ...,...

方式2:

select ...,....,...
from ... join ... 
on 多表的连接条件
join ...
on ...
where 不包含组函数的过滤条件
and/or 不包含组函数的过滤条件
group by ...,...
having 包含组函数的过滤条件
order by ... asc/desc
limit ...,...

其中:

(1)from:从哪些表中筛选
(2)on:关联多表查询时,去除笛卡尔积
(3)where:从表中筛选的条件
(4)group by:分组依据
(5)having:在统计结果中再次筛选
(6)order by:排序
(7)limit:分页

select语句执行顺序

from -> where -> group by -> having -> select 的字段 -> distinct -> order by -> limit

到此这篇关于mysql使用聚合函数时需要注意事项的文章就介绍到这了,更多相关mysql聚合函数使用内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com