> 文章列表 > 数据库基础篇 《8. 聚合函数》

数据库基础篇 《8. 聚合函数》

数据库基础篇 《8. 聚合函数》

1. 聚合函数介绍

 聚合函数不能嵌套调用。比如不能出现类似“AVG(SUM(字段名称))”形式的调用

1.1 AVGSUM函数

可以对 数值型数据 使用 AVG SUM 函数。
SELECT AVG(salary), MAX(salary),MIN(salary), SUM(salary)
FROM employees
WHERE job_id LIKE '%REP%';

1.2 MINMAX函数

可以对 任意数据类型 的数据使用 MIN MAX 函数。
SELECT MIN(hire_date), MAX(hire_date)
FROM employees;

 

1.3 COUNT函数

COUNT(*) 返回表中记录总数,适用于 任意数据类型
SELECT COUNT(*)
FROM employees
WHERE department_id = 50;
COUNT(expr) 返回 expr 不为空 的记录总数。

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

 

 

2. GROUP BY

2.1 基本使用

可以使用GROUP BY子句将表中的数据分成若干组  

SELECT column, group_function(column)
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[ORDER BY column];
明确: WHERE 一定放在 FROM 后面
SELECT 列表中所有未包含在组函数中的列都应该包含在 GROUP BY 子句中
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id ;

 

SELECT AVG(salary)
FROM employees
GROUP BY department_id ;

2.2 使用多个列分组

 

SELECT department_id dept_id, job_id, SUM(salary)
FROM employees
GROUP BY department_id, job_id ;

 

2.3 GROUP BY中使用WITH ROLLUP

使用 WITH ROLLUP 关键字之后,在所有查询出的分组记录之后增加一条记录,该记录计算查询出的所有记录的总和,即统计记录数量。
SELECT department_id,AVG(salary)
FROM employees
WHERE department_id > 80
GROUP BY department_id WITH ROLLUP;
注意:
当使用 ROLLUP 时,不能同时使用 ORDER BY 子句进行结果排序,即 ROLLUP ORDER BY 是互相排斥的。

3. HAVING

3.1 基本使用

SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary)>10000 ;

非法使用聚合函数 : 不能在 WHERE 子句中使用聚合函数。如下:

SELECT department_id, AVG(salary)
FROM employees
WHERE AVG(salary) > 8000
GROUP BY department_id;

 3.2 WHEREHAVING的对比  

 

4. SELECT的执行过程

4.1 查询的结构

#方式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)from:从哪些表中筛选
#(2)on:关联多表查询时,去除笛卡尔积
#(3)where:从表中筛选的条件
#(4)group by:分组依据
#(5)having:在统计结果中再次筛选
#(6)order by:排序
#(7)limit:分页

4.2 SELECT执行顺序

你需要记住 SELECT 查询时的两个顺序:
1. 关键字的顺序是不能颠倒的:
SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ... LIMIT...

2.SELECT 语句的执行顺序(在 MySQL Oracle 中,SELECT 执行顺序基本相同)

 FROM -> WHERE -> GROUP BY -> HAVING -> SELECT 的字段 -> DISTINCT -> ORDER BY -> LIMIT

比如你写了一个 SQL 语句,那么它的关键字顺序和执行顺序是下面这样的:  

SELECT DISTINCT player_id, player_name, count(*) as num # 顺序 5
FROM player JOIN team ON player.team_id = team.team_id # 顺序 1
WHERE height > 1.80 # 顺序 2
GROUP BY player.team_id # 顺序 3
HAVING num > 2 # 顺序 4
ORDER BY num DESC # 顺序 6
LIMIT 2 # 顺序 7