1. 聚合函数介绍
1.1 什么是聚合函数
聚合(或聚集、分组)函数,是对一组数据进行汇总的函数,输入的是一组数据的集合,输出的是单个值。
聚合函数作用于一组数据,并对一组数据返回一个值。
1.2 常用的聚合函数
- AVG()
- SUM()
- MAX()
- MIN()
- COUNT()
2. 常用的聚合函数
2.1 AVG()
只适用于数值类型的字段(或变量)
# 查询所有员工的平均工资 SELECT AVG(salary) FROM employees;
2.2 SUM()
只适用于数值类型的字段(或变量)
# 查询所有员工的工资总和 SELECT SUM(salary), # 一共有107个员工 AVG(salary) * 107 FROM employees;
2.3 MAX()
# 查询员工的最高工资 SELECT MAX(salary) FROM employees;
MAX()适用于数值类型、字符串类型、日期时间类型等可以进行大小比较的字段(变量)。
SELECT MAX(last_name), MAX(hire_date) FROM employees;
2.4 MIN()
# 查询员工的最低工资 SELECT MIN(salary) FROM employees;
MIN()适用于数值类型、字符串类型、日期时间类型等可以进行大小比较的字段(变量)。
SELECT MIN(last_name), MIN(hire_date) FROM employees;
2.5 COUNT()
计算指定字段在查询结果中出现的个数。
# 查询在全部的107行数据中,有几行拥有员工id这个字段 SELECT COUNT(employee_id) FROM employees;
COUNT()统计个数,不关注字段的具体取值为多少,只关注某行数据是否具有该字段,该字段是否为空。不为空就加入计数。
SELECT COUNT(employee_id), count(salary), count(salary * 2) FROM employees;
COUNT()统计常量
SELECT COUNT(employee_id), count(salary), count(salary * 2), count(1) FROM employees;
计算表中有多少条记录:
SELECT COUNT(1), COUNT(*) FROM employees;
不建议通过统计某个字段的取值的个数来统计表格的行数,因为有些字段的某些行可能取值为空,而COUNT()不会统计空值。
2.6 补充
AVG()、SUM()和COUNT()一样,会过滤空值。
SELECT AVG(commission_pct), SUM(commission_pct) / COUNT(commission_pct), # 由于AVG() SUM() COUNT() 都会过滤空值 # 所以SUM(commission_pct) / 107会比上面的小 SUM(commission_pct) / 107 FROM employees;
# 计算公司的平均奖金率 # 错误计算方法 # 因为有没有奖金的员工,而AVG()会默认过滤空值 # 所以不能使用这种计算方法 SELECT AVG(commission_pct) FROM employees; # 正确的计算方法 # 对于没有奖金的员工commission_pct=0,然后进行统计 SELECT AVG(IFNULL(commission_pct, 0)), SUM(commission_pct) / COUNT(*), SUM(IFNULL(commission_pct, 0)) / COUNT(*) FROM employees;
如何需要统计表中的记录数,使用COUNT(
*
)、COUNT(1)、COUNT(具体字段) 哪个效率更高呢?如果使用的是MyISAM 存储引擎,则三者效率相同,都是O(1)
如果使用的是InnoDB 存储引擎,则三者效率:COUNT(
*
) = COUNT(1)> COUNT(字段)
3. GROUP BY
GROUP BY子句可以将表中的数据分成若干组
3.1 分组的基本使用
# 查询各个部门的员工的平均工资 SELECT department_id, AVG(salary) FROM employees GROUP BY department_id;
# 查询每个工作的平均工资 SELECT job_id, AVG(salary) FROM employees GROUP BY job_id;