SQL函数还有一类,叫做聚合(或聚集、分组)函数,它是对一组数据进行汇总的函数,输入的是一组数据的集合,输出的是单个值。

聚合函数作用于一组数据,并对一组数据返回一个值。比如求一组数据的和、平均值等等…

AVG/SUM

AVG/SUM:只适用于数值类型的字段(或变量)。
注意
AVG和SUM计算时都会过滤null值。比如公司100个人,95个有salary,5个人salary为null,那么AVG(salary)=95个人的平均工资。SUM(salary)=95个人的工资总和。
max/min

count

如果计算表中有多少条记录,如何实现?
#方式一:count()
#方式二:count(常数)
#方式三:count(具体字段) 不一定对,因为该字段在某一行可能为null,不会计入。
注意
计算指定字段出现的个数时,是不计算null值的。

查询公司员工的平均奖金率

==**若需要统计表中的记录数,使用count()、count(常数)、count(具体字段),哪个效率更高?**==
1.若使用的是MyISAM存储引擎,则三者效率相同,都是O(1)
2.若使用的是InnoDB存储引擎,则三者效率:count(*)=count(常数)>count(字段)
group by的使用
需求:查询各个部门的平均工资
按照部门id来分组。

各个部门department_id下面还有工作分类job_id。
需求:查询各个department_id下面的各个job_id的平均工资
这里department_id和job_id的先后顺序可以颠倒,因为只有这两种属性都相同的才会分到一个组,区别在于先对哪个进行分类,但结果是一样的。

注意
1.select中出现的非组函数的字段必须声明在group by中(但是MySQL不会报错)。反之,group by中声明的字段可以不出现在select中。
2.group by声明在from后面,where后面,order by前面,limit前面。
3.若在MySQL中group by使用with rollup,在查询最后一条会统计数据和
说明:用了with rollup就不能用order by排序了。但8.0版本不会报错

having的使用
作用:用来过滤数据。
查询各个部门中最高工资比1w高的部门信息
#错误写法
select department_id,max(salary)
from employees
where max(salary)>10000
group by department_id;
如果过滤条件中使用了聚合函数,则必须使用having来替换where,否则报错
也就是说where中不能有聚合函数
having必须声明在group by后面
#正确写法
select department_id,max(salary)
from employees
group by department_id
having max(salary)>10000
一般开发中,我们使用having的前提是SQL中使用了group by。
查询部门id为10,20,30这三个部门中最高工资比1w高的部门信息
#方式一
select department_id,max(salary)
from employees
where department_id in(10,20,30)
group by department_id
having max(salary)>10000;
#方式二
select department_id,max(salary)
from employees
group by department_id
having max(salary)>10000 and department_id in(10,20,30);
结论
当过滤条件中有聚合函数时,此过滤条件必须声明在having中。
当没有时,过滤条件声明在where中或having中都可,但建议声明在where中,效率更高。

#sql92语法 基本结构
select ...,...(存在聚合函数)
from ...,...,...
where 多表的连接条件 and 不包含聚合函数的过滤条件
group by...,...
having 包含聚合函数的过滤条件
order by...,...(asc/desc)
limit ...,...
#sql99语法 基本结构
select ...,...,...(存在聚合函数)
from...(left/right)join...on 多表的连接条件
(left/right)join...on...
where 不包含聚合函数的过滤条件
group by...,...
having 包含聚合函数的过滤条件
order by ...,...(asc/desc)
limit ...,...
SQL语句的执行过程
from—on----(left / right join)----where-----group by -----having----select----distinct(去重)—order by----limit