文章目录
聚合函数
1. 聚合函数介绍
-
什么是聚合函数
聚合函数作用于一组数据,并对一组数据返回一个值。
-
聚合函数类型
- AVG()
- SUM()
- MAX()
- MIN()
- COUNT()
-
聚合函数语法
-
聚合函数不能嵌套调用。比如不能出现类似“AVG(SUM(字段名称))”形式的调用。
1.1 AVG和SUM函数
可以 对数值型数据 使用AVG 和 SUM 函数。
#AVG / SUM :只适用于数值类型的字段(或变量)
SELECT AVG(salary),SUM(salary),AVG(salary) * 107
FROM employees;
#如下的操作没有意义
SELECT SUM(last_name),AVG(last_name),SUM(hire_date)
FROM employees;
1.2 MIN和MAX函数
可以对 任意数据类型 的数据使用 MIN 和 MAX 函数。
#MAX / MIN :适用于数值类型、字符串类型、日期时间类型的字段(或变量)
SELECT MAX(salary),MIN(salary)
FROM employees;
#只要的排序的字段都能比较大小。
SELECT MAX(last_name),MIN(last_name),MAX(hire_date),MIN(hire_date)
FROM employees;
1.3 COUNT函数
- COUNT(*)返回表中记录总数,适用于 任意数据类型。
#作用:计算指定字段在查询结构中出现的个数(不包含NULL值的)
SELECT COUNT(employee_id),COUNT(salary),COUNT(2 * salary),COUNT(1),COUNT(2),COUNT(*)
FROM employees;
- COUNT(expr) 返回 expr不为空 的记录总数。
SELECT COUNT(commission_pct),COUNT(salary)
FROM employees;
#如果计算表中有多少条记录,如何实现?
#方式1:COUNT(*)
#方式2:COUNT(1)
#方式3:COUNT(具体字段) : 不一定对!(该列可能会有空值)
SELECT COUNT(*),COUNT(1),COUNT(commission_pct)
FROM employees;
- 问题:用count(*),count(1),count(列名)谁好呢?
其实,对于MyISAM引擎的表是没有区别的。这种引擎内部有一计数器在维护着行数。Innodb引擎的表用count(*),count(1)直接读行数,复杂度是O(n),因为innodb真的要去数一遍。但好于具体的count(列名)。
如何需要统计表中的记录数,使用COUNT(*)、COUNT(1)、COUNT(具体字段) 哪个效率更高呢?
如果使用的是MyISAM 存储引擎,则三者效率相同,都是O(1)
如果使用的是InnoDB 存储引擎,则三者效率:COUNT(*) = COUNT(1)> COUNT(字段)
- 问题:能不能使用count(列名)替换count(*)?
不要使用 count(列名)来替代count(*)
,count(*)
是 SQL92 定义的标准统计行数的语法,跟数据库无关,跟 NULL 和非 NULL 无关。
说明:count(*)会统计值为 NULL 的行,而 count(列名)不会统计此列为 NULL 值的行。
公式:AVG = SUM / COUNT
#公式:AVG = SUM / COUNT
SELECT AVG(salary),SUM(salary) / COUNT(salary),
AVG(commission_pct),SUM(commission_pct) / COUNT(commission_pct),
SUM(commission_pct) / 107
FROM employees;
题目:查询公司中平均奖金率
#错误的!
SELECT