一、常见的几个聚合函数
- AVG:计算平均值
- SUM:求和
- MAX:求最大值
- MIN:求最小值
- COUNT:计数
# 求员工工资的平均值、总和、最大值、最小值以及员工人数
SELECT AVG(salary),SUM(salary),MAX(salary),MIN(salary),COUNT(last_name)
FROM employees;
- 注意事项:
- 1、avg、sum用于数值型
- avg =sum / count
- 2、max、min可用于数值型、字符型、日期时间类型
- 3、count 可用于数值型、字符型(只要不是null,都会计算)
- 统计表中的记录数:可使用count(*)、count(1)、count(具体字段)
- 若使用MyISAM存储引擎,上述三种效率相同;若使用InnoDB存储引擎,则count(*) = count(1) > count(具体字段)
- 1、avg、sum用于数值型
二、GROUP BY的使用
- 注意 “ 各个 ” 后面的字段
# 需求:查询各个department_id,job_id的平均工资
SELECT department_id,job_id,AVG(salary)
FROM employees
GROUP BY job_id,department_id;
- group by 后面的字段可交换次序
- select中出现的非组函数的字段必须声明在 group by 中;反之,group by中声明的字段可以不出现在select中。
- group by 的位置:在where后面,order by前面
- 新特性:with rollup 计算整体的特征(在和order by一起的时候,慎用)
# 计算公司整体以及各个部门的平均工资
SELECT department_id,AVG(salary)
FROM employees
GROUP BY department_id WITH ROLLUP;
三、HAVING的使用
- 要求1:过滤条件中使用了聚合函数,则必须使用having来替换where
- 要求2:having必须声明在group by的后面
# 需求:查询各个部门工资中最高工资比10000高的部门信息
SELECT MAX(salary) AS '最高工资',department_id
FROM employees
GROUP BY department_id
HAVING 最高工资 > 10000;
- 当过滤条件中有聚合函数时,则此过滤条件必须声明在having中
- 当过滤条件中无聚合函数时,则此过滤条件声明放到where中
- where 和 having 对比
- 1、having适用范围更广
- 2、如果过滤条件中无聚合函数,where效率高于having
四、SQL底层的执行原理
4.1 SELECT语句的完整结构
select 字段名
from 表名 (left/right)join 表名 on 连接条件
where 筛选条件
group by 字段名
having 包含聚合函数的筛选条件
order by 字段名 asc/desc
limit (pageNum-1)*pageSize,pageSize;
4.2 语句的执行过程
from......on......(left/right join)
where
group by
having
select...... distinct
order by
limit
参考:尚硅谷-宋红康老师的视频及课件。