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为10,20,30,40这四个部门中最高工资比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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!