mysql-聚合函数

一、聚合函数

1.常见的几个聚合函数

1.1 AVG/SUM

  • AVG:求平均数
  • SUM:求总和
select AVG(salary),SUM(salary)
from employees;

1.2 MAX/MIN

  • max/min:适用于时间类型,字符串类型,日期类型(或变量)
select MAX(salary),MIN(salary)
from employees;

1.3 count

  • count:计算字段在查询结果中出现的次数。
    select count(first_name) from employees;
  • count(),count(1),count(字段):那个效率会更高?
    如果使用的是5.7版本,该版本的存储引擎是MYISAM,三者效率相同
    mysql8的版本存储引擎为InnoDB,count(
    ) = count(1) > count(字段)

2.GROUP BY的使用

#GROUP BY
#练习:查询各个部门的平均工资
select AVG(salary),department_id
from employees
group by department_id;

#练习:查询各个部门,各个工种的平均工资
select job_id,department_id,AVG(salary)
from employees
group by department_id,job_id;
  • 结论1:select 中出现的字段必须出现在group by 中,反之 group by中出现的字段不一定非要出现在 select 之中。
  • 结论2:group by声明在from,where后面,order by,limit的前面

3.HAVING的使用

  • 作用:用来过滤数据

#HAVING
#练习:查询各个部门中的最高工资比10000高的部门信息
# 错误写法
select department_id,MAX(salary) as m
from employees
where m >1000
GROUP BY department_id;

#结论1:查询语句中使用了group by函数之后必须使用 HAVING 来代替 where 。否则报错
#正确写法
select department_id,MAX(salary) as m
from employees
GROUP BY department_id
HAVING m > 10000;


  • 结论:开发中,我们使用HAVING的前提是sql中使用了group by
#查询部门id为10203040这四个部门中最高工资比10000高的部门
#方式1
SELECT department_id,MAX(salary)
FROM employees
where department_id in (10,20,30,40) 
GROUP BY department_id
HAVING  MAX(salary) > 10000;

#方式2
SELECT department_id,MAX(salary)
FROM employees
GROUP BY department_id
HAVING department_id in (10,20,30,40) AND MAX(salary) > 10000;

#思考:既然方式2可以为什么不淘汰where呢?
#原因:where的执行效率优于HAVING
  • 结论:当过滤条件中有聚合函数时,则过滤条件必须声明在HAVING当中
    当过滤条件没有聚合函数时,则该条件应当声明在where当中提高效率

  • 总结

# sql99语法
select ...,...,...,avg(),sum,min(),max(),count()
from ... (left/right) join on
where
group by 
having
order by (desc / asc)
limit 
posted @   阿远不颓废!  阅读(171)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示