聚合函数

聚合函数概念

聚合函数用于一组数据,并对一组数据返回一个值

聚合函数类型

  • AVG()
  • SUM()
  • MAX()
  • MIN()
  • COUNT()

AVG 和 SUM

1
2
3
SELECT AVG(salary), MAX(salary),MIN(salary), SUM(salary)
FROM employees
WHERE job_id LIKE '%REP%';

MIN 和 MAX

1
2
SELECT MIN(hire_date), MAX(hire_date)
FROM employees;

COUNT

注意

  • COUNT(*) 返回表中记录总数,适用于任意数据类型
  • COUNT(expr) 返回 expr 不为空 的记录总数
1
2
3
4
5
6
7
SELECT COUNT(*)
FROM employees
WHERE department_id = 50;

SELECT COUNT(commission_pct)
FROM employees
WHERE department_id = 50;

能不能使用 count(列名) 替换 count(*) ?

count(*) 会统计值为 NULL 的行,而 count(列名) 不会统计此列为 NULL 值的行。

GROUP BY

使用 GROUP BY 将数据分成若干组

1
2
3
4
5
SELECT column, group_function(column)
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[ORDER BY column];
1
2
3
4
5
6
7
8
9
-- 单列分组
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id ;

-- 多列分组
SELECT department_id dept_id, job_id, SUM(salary)
FROM employees
GROUP BY department_id, job_id ;

使用 WITH ROLLUP 关键字之后,在所有查询出的分组记录之后增加一条记录,该记录计算查询出的所有记录的总和,即统计记录数量。

1
2
3
4
SELECT department_id,AVG(salary)
FROM employees
WHERE department_id > 80
GROUP BY department_id WITH ROLLUP;

注意: 当使用 ROLLUP 时,不能同时使用 ORDER BY 子句进行结果排序,即 ROLLUP 和 ORDER BY 是互相排斥的。

HAVING

HAVING 过滤分组

  • 行已经被分组
  • 使用了聚合函数
  • 将显示满足 HAVING 子句中条件的分组
  • HAVING 不能单独使用,必须要跟 GROUP BY 一起使用
1
2
3
4
5
6
SELECT [column, ..] group function(column),...
FROM t_name
[WHERE condition]
[GROUP BY group_by_expression]
[HAVING group_condition]
[ORDER BY column];
1
2
3
4
SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary)>10000;

WHERE 与 HAVING 对比

1. WHERE 可以直接使用表中的字段作为筛选条件,但不能使用分组中的计算函数作为筛选条件; HAVING 必须要与 GROUP BY 配合使用,可以把分组计算的函数和分组字段作为筛选条件

2. 如果需要通过连接从关联表中获取需要的数据,WHERE 是先筛选后连接,而 HAVING 是先连接后筛选

SELECT 执行过程

查询结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
-- 方式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
SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ... LIMIT...

SELECT 语句的执行顺序