MySQL DQL 语言 - 常见函数(3 - 分组函数)
功能:
用作统计使用,又称为 聚合函数,统计函数,组函数。
下面主要包括:SUM
:求和, AVG
:平均值, MAX
:最大值, MIN
:最小值, COUNT
:计算个数。
语法
[]
表示可选。
SUM([DISTINCT] expr);
MIN([DISTINCT] expr);
MAX([DISTINCT] expr);
DISTINCT
去除。
SELECT SUM(salary) AS 求和
FROM employees;
求和 |
---|
691400.00 |
在 单行函数 中,运算结果一般都是很多行(即:函数对每一行分别出一次结果),而 分组函数 如上面,对所有行,只出一个结果。
SELECT SUM(salary) FROM employees; #691400.00
SELECT AVG(salary) FROM employees; #6461.682243
SELECT MIN(salary) FROM employees; #2100.00
SELECT MAX(salary) FROM employees; #24000.00
SELECT COUNT(salary) FROM employees; #107
也可以写在一起:
SELECT
SUM(salary) sum,
AVG(salary) avg,
MAX(salary) max,
MIN(salary) min,
COUNT(salary) count
FROM employees;
sum | avg | max | min | count |
---|---|---|---|---|
691400.00 | 6461.682243 | 24000.00 | 2100.00 | 107 |
平均值保留 2 位:
SELECT ROUND(AVG(salary), 2) FROM employees; #6461.68
参数所支持类型
SUM
AVG
一般只适用于处理 数值型。MAX
,MIN
支持 字符型,日期型。COUNT
支持任何类型。(COUNT
计算相应字段 非空 的数量)
SELECT MAX(last_name) max, MIN(last_name) min FROM employees;
max | min |
---|---|
Zlotkey | Abel |
last_name
是 字符型,字符型可以进行排序,所以,就会存在 可比性,所以MAX
,MIN
支持 字符型。
SELECT MAX(hiredate) max, MIN(hiredate) min FROM employees;
max | min |
---|---|
2016-03-03 00:00:00 | 1992-04-03 00:00:00 |
hiredate
是 日期型。
是否忽略 NULL
SUM
AVG
MAX
MIN
COUNT
忽略 NULL
。
SELECT
SUM(commission_pct) sum,
AVG(commission_pct) avg,
SUM(commission_pct) / 35 avg35,
SUM(commission_pct) / 107 avg107
FROM employees;
sum | avg | avg35 | avg107 |
---|---|---|---|
7.80 | 0.222857 | 0.222857 | 0.072897 |
commission_pct
包含NULL
。
SUM
:结果出现数据,而NULL
+
任何值都为NULL
,所以SUM
忽略NULL
。AVG
:表中共有 107 条数据,35 条数据的commission_pct
不为NULL
,avg
和avg35
的值相同,所以AVG
忽略NULL
。
SELECT MAX(commission_pct) max, MIN(commission_pct) min FROM employees;
max | min |
---|---|
0.40 | 0.10 |
commission_pct
存在NULL
,如果MAX
MIN
不忽略NULL
,那么,要么最小值为NULL
,要么最大值为NULL
。
COUNT
定义:计算非空的值的数量,所以忽略NULL
。
搭配 DISTINCT 实现去除
SELECT SUM(DISTINCT salary) , SUM(salary) FROM employees;
SUM(DISTINCT salary) | SUM(salary) |
---|---|
397900.00 | 691400.00 |
加入
DISTINCT
后会先去重,然后求和。
SELECT COUNT(DISTINCT salary) ,COUNT(salary) FROM employees;
COUNT(DISTINCT salary) | COUNT(salary) |
---|---|
57 | 107 |
去重后,就是计算有多少种不同的工资了。
COUNT
COUNT(expr);
SELECT COUNT(*) FROM employees;
COUNT(*)
经常用来统计总行数:
假设一个表中有三列A
B
C
。A
列第 3 行为NULL
,B
列第 5 行为NULL
,C
列第 7 行为NULL
,但只要B
C
列中有一列部位NULL
,那么行数就会+1
。如果所有列都为NULL
,那这一行自然是不存在数据的。
SELECT COUNT(1) FROM employees;
也是统计总行数:
相当于在原表之外又增加了一个新列,这列的行数和表中其他列的行数相等,并且所有行的数据均为1
。所以相当于在计算新增加这列的行数,所以也是总行数。
注:
只要加的是常量值即可。
效率:
MYISAM
存储引擎下,COUNT(*)
效率最高INNODB
存储引擎下,COUNT(*)
和COUNT(1)
效率差不多,比COUNT(字段)
要高一些,因为 加字段,要先判断字段是否为NULL
。
和分组函数一同查询的字段有限制
和分组函数一同查询的字段要求是 GROUT BY
后的字段。