第08章聚合函数
上一章讲到了 SQL 单行函数。实际上 SQL 函数还有一类,叫做聚合(或聚集、分组)函数,它是对一组数据进行汇总的函数,输入的是一组数据的集合,输出的是单个值。
1.聚合函数介绍
- 什么是聚合函数
聚合函数作用于一组数据,并对一组数据返回一个值。
- 聚合函数类型
AVG()
SUM()
MAX()
MIN()
COUNT() - 聚合函数语法
- 聚合函数不能嵌套调用。比如不能出现类似“AVG(SUM(字段名称))”形式的调用。
1.1 AVG和SUM函数
可以对数值型数据使用AVG 和 SUM 函数。
#1.1 AVG/SUM:只适用于数值类型的字段(或变量)
SELECT AVG(salary), MAX(salary),MIN(salary), SUM(salary)
FROM employees;
#输出
+-------------+-------------+-------------+-------------+
| AVG(salary) | MAX(salary) | MIN(salary) | SUM(salary) |
+-------------+-------------+-------------+-------------+
| 6461.682243 | 24000.00 | 2100.00 | 691400.00 |
+-------------+-------------+-------------+-------------+
1 row in set (0.00 sec)
#如下操作没有意义
SELECT SUM(last_name),AVG(last_name),SUM(last_name)
FROM employees;
1.2 MIN和MAX函数
可以对任意数据类型的数据使用 MIN 和 MAX 函数。
SELECT MIN(hire_date), MAX(hire_date)
FROM employees;
#输出
+----------------+----------------+
| MIN(hire_date) | MAX(hire_date) |
+----------------+----------------+
| 1987-06-17 | 2000-04-21 |
+----------------+----------------+
1 row in set (0.00 sec)
1.3 COUNT函数
- COUNT(*)返回表中记录总数,适用于任意数据类型。
#1.3 COUNT
#1.3.1 作用:计算指定字段在查询结构中出现的个数
SELECT COUNT(employee_id),COUNT(salary),COUNT(2*salary),COUNT(1),COUNT(2),COUNT(*)
FROM employees;
#输出
+--------------------+---------------+-----------------+----------+----------+----------+
| COUNT(employee_id) | COUNT(salary) | COUNT(2*salary) | COUNT(1) | COUNT(2) | COUNT(*) |
+--------------------+---------------+-----------------+----------+----------+----------+
| 107 | 107 | 107 | 107 | 107 | 107 |
+--------------------+---------------+-----------------+----------+----------+----------+
1 row in set (0.00 sec)
#如果计算表中有多少条记录,该如何实现?
#方式1:COUNT(*)
#方式2:COUNT(1)
#方式3:COUNT(具体字段):不一定对!
- COUNT(expr) 返回expr不为空的记录总数。
#1.3.2 注意:计算指定字段出现的个数时,是不计算NULL值的,也就是COUNT会过滤NULL。
SELECT COUNT(commission_pct)
FROM employees;#35条记录
SELECT commission_pct
FROM employees
WHERE commission_pct IS NOT NULL;
#1.3.3 AVG=SUM/COUNT, SUM会过滤掉NULL
SELECT AVG(salary),SUM(salary)/COUNT(salary),
AVG(commission_pct),SUM(commission_pct)/COUNT(commission_pct),
SUM(commission_pct)/107
FROM employees;
#输出
+-------------+---------------------------+---------------------+-------------------------------------------+-------------------------+
| AVG(salary) | SUM(salary)/COUNT(salary) | AVG(commission_pct) | SUM(commission_pct)/COUNT(commission_pct) |SUM(commission_pct)/107 |
+-------------+---------------------------+---------------------+-------------------------------------------+-------------------------+
| 6461.682243 | 6461.682243 | 0.222857 | 0.222857 | 0.072897 |
+-------------+---------------------------+---------------------+-------------------------------------------+-------------------------+
1 row in set (0.00 sec)
#需求:查询公司中平均奖金率(没有奖金的人也要算在内)
#错误的!
SELECT AVG(commission_pct)
FROM employees;
#输出
+---------------------+
| AVG(commission