五大常用的聚合函数
聚合(分组)函数 :
是对一组数据进行汇总的函数,输入的是一组数据的集合,而输出的是单个值
- 之前我们讲过的单行函数是对一行数据进行变换,每行返回一个结果
这里我们将对五个常用的聚合函数进行讲解,我们分为三个部分进行讲解
- AVG() 和 SUM()
这里我们通过举例的方式理解AVG()和SUM()的使用
eg1:
SELECT AVG(salary),SUM(salary)
FROM employees;
- 这里就是计算员工表中的平均工资和总工资
- 这个使用我们没有使用GROUP BY操作分组,那么这个时候默认将表中的所有数据分为了一个大组
eg2:
SELECT SUM(last_name),AVG(last_name),SUM(hire_date)
FROM employees;
- 这里的这几个sum操作和avg操作都是无效的,因为sum和avg都不能对非数值的字段进行操作,而这里的last_name就是字符串类型的,hire_date是日期类型的
- 如果是在Oracle中执行这个操作我们会发现会报错,也就是执行不了,因为在Oracle中就是直接不能使用sum和* avg操作非数值类型的字段,但是在MySQL中对于这种非数值的字段其实还是执行不了,比如对于字符串类型的字段我们执行了sum或者avg操作之后永远都会得到一个0,如果是日期类型的数值,我们会得到一串数值(可能是时间戳)
总结:AVG()和SUM()只使用与数值类型的字段(或者变量)
- MAX() 和 MIN()
这里我们通过举例来理解如何使用MAX和MIN
eg1:
SELECT MAX(salary),MIN(salary)
FROM employees;
eg2:
SELECT MAX(last_name),MIN(last_name),MAX(hire_date)
FROM employees;
- 前面我们说过了使用avg和sum是无法操作非数值类型的字段的,那么对于max和min可以操作非数值类型数据吗? — 我们执行之后可以发现我们可以得到返回的字符串类型的结果和date类型的结果,也就是说明: max和min都是可以对非数值类型的数据进行操作的
- 其实我们可以想到,字符串类型和日期类型的数据都是可以比较大小的,只是不可以做求和运算,因为我们之前将ORDER BY(排序)的时候我们就讲过了,我们可以使用字符串类型的字段和日期类型的字段作为排序的依据,那么可以排序也即是说明字符串类型和日期类型的数据是可以比较大小的
总结:MAX()和MIN()使用于数值类型,字符串类型,日期时间类型的字段(或变量)
字符串和日期时间类型的数据不可以进行加法运算(求和运算),但可以比较大小
- COUNT()
这里我们通过举例来说明COUNT()的使用
eg:
SELECT COUNT(employee_id),COUNT(commission_pct),COUNT(1),COUNT(*)
FROM employees;
- 这个时候查询的COUNT(employee_id)为107,因为employees表中有107条记录,并且这107条记录的employee_id字段值都不为null
- 而这个时候查询的COUNT(commission_pct)为100,因为这个时候表中有7条记录的commission_pct字段值为null,而我们这里讲述的这五个聚合函数执行中都是忽略null值的
- 这里的COUNT(1)和COUNT(*)都为107
- 我们查询表中记录数的时候通常就是查询COUNT(*)
这里我们引出一个问题: 如果要计算表中有多少条记录,我们如何实现?
方式一: COUNT(*)
方式二: COUNT(常数)
方式三: COUNT(具体字段)
易错易混淆问题分析:
下面我们通过几个例子来分析:
SELECT AVG(commission_pct),SUM(commission_pct)/COUNT(commission_pct),SUM(commission_pct)/107
FROM employees;
通过上面的易错易混淆问题分析我们引出一个例题: 查询公司中的平均奖金率
SELECT AVG(commission_pct)
FROM employees;
- 这种写法是错误的,这里查询出的其实是公司中有奖金率的员工的平均奖金率,而不是查询出了公司中所有员工的平均奖金率,因为公司中有的人的奖金率为null,也就是没有奖金率
后面这三种写法都是正确的,都可以计算出公司中的所有员工的平均奖金率
SELECT AVG(IFNULL(commission_pct,0))
FROM employees;
SELECT SUM(commission_pct)/COUNT(IFNULL(commission_pct,0)
FROM employees;
SELECT SUM(commission_pct)/COUNT(1)
FROM employees;
|