文章内容索引:
sum()、avg()、max()、min()、count()。
为了学习过程不至于太枯燥,这次我给下面的子标题起了一些咋咋呼呼的名字,哈哈哈。这样导致博客的浏览效率可能有所下降,但是结合我下面的文字描述,整体上还是能轻松的明白我的意思的!
告辞了!水遁!( =‵▽′)ノ’卍卍卍卍卍卍 Σ(゜д゜;)
秘·奥义·分组函数!
这一篇我们介绍一下MySQL中的分组函数。
功能:做统计使用,又称为统计函数、聚合函数、组函数。
主要有:sum 求和、avg() 平均值、max() 最大值、min() 最小值、count() 计数。
一、简单の试探!
我们先进行一些简单的应用,可以利用分组函数直接求我们想要计算的值。例如:
# 求员工工资之和
SELECT SUM(salary) FROM employees;
# 求员工工资平均值
SELECT AVG(salary) FROM employees;
# 求员工工资最大值
SELECT MAX(salary) FROM employees;
# 求员工工资最小值
SELECT MIN(salary) FROM employees;
# 求员工中有工资的人数数量
SELECT COUNT(salary) FROM employees;
也可以同时使用多个函数搭配,进行求值运算:
# 统计员工工资的和、均值、最大值、最小值以及数量。
SELECT
SUM(salary) AS 和,
AVG(salary) AS 平均值,
MAX(salary) AS 最大值,
MIN(salary) AS 最小值,
COUNT(salary) AS 数量
FROM
employees ;
# 求员工工资的和以及平均值(保留两位小数)
SELECT
SUM(salary) AS 和,
ROUND(AVG(salary),2) AS 平均值
FROM
employees ;
二、研究秘术的特点!
1.可用的参数类型!
我们先讨论一下分组函数支持的参数类型。sum()
和avg()
:一般用于处理数值型数据。max()
、min()
和count()
:可以处理任何类型的数据:数值型数据,字符型数据,日期型数据。
2.NULL值的抉择!
接下来讨论一下分组函数在运算时是否忽略NULL值。sum()
、avg()
、max()
、min()
、count()
:这五个函数在运算时都忽略NULL值。
3.和distinct联手!
分组函数可以和distinct搭配使用实现去重的运算。
例如:
- 求出员工工资之和,并且求出去掉重复工资之后的工资之和。
SELECT
SUM(DISTINCT salary),
SUM(salary)
FROM
employees ;
- 结果:
- 计算工作的种类数目。
SELECT
COUNT(DISTINCT job_id) 工作种类
FROM
employees ;
- 结果:
4. 对count()的苦苦思索!
接下来我们详细的介绍一下count()函数。
①count()的用法
第一种就是上面用到的简单的应用,后面直接跟字段即可。
# 求工资字段的数量
SELECT COUNT(salary) FROM employees;
也可以使用*号来统计表的行数。(常用☆☆☆☆☆)
# 求employees表的行数
SELECT COUNT(*) FROM employees;
我们也可以在count()里面跟一个常量,例如:
# 求employees表的行数
SELECT COUNT(1) FROM employees;
这样就相当于在表中我们添加了一列,这一列的值全部为1,并且我们统计它的个数,其实就是在统计表的行数。这里的1我们可以换成是任何一个常量,可以是“2
”,可以是“veeja
”,可以是“刘伟佳
”,他们的效果都是一样的。
② count()的效率
在MYISAM存储引擎之下,count(*)
的效率最高。
在INNOB存储引擎之下,经过实验发现,count(*)
和count(1)
的效率差不多,都比count(字段)
的效率高一些。
5. 秘术の禁忌!
我们还可以注意到,和分组函数一同查询的字段有限制。
比如,我们执行以下语句:
SELECT
COUNT(*),
employee_id
FROM
employees ;
count(*)
是在查询所在表的行数,employee_id
是在查询所有的员工id,明显前者的结果为一行,而后者的结果是多行的,语句执行后,并不会报错,但是这种结果显示出来毫无意义。
和分组函数一同查询的字段要求是group by后的字段。如果不明白不要紧,我们以后再讲。
三、秘术の训炼!
学习完了分组函数,我们可以做一些练习实验一下。(数据库可以自己建立,够实验用就好)
- 查询员工的工资的最大值,最小值,平均值,总和。
- 查询员工表中最大入职时间和最小入职时间的相差天数(
datediff()
函数)。 - 查询部门编号为90的员工个数。
答案:
#-----------1-----------
SELECT
MAX(salary) 最大值,
MIN(salary) 最小值,
AVG(salary) 平均值,
SUM(salary) 总和
FROM
employees ;
#-----------2-----------
#使用datediff()函数,参数是两个日期数值
SELECT
DATEDIFF(MAX(hiredate), MIN(hiredate)) AS 相差天数
FROM
employees ;
#-----------3-----------
SELECT
COUNT(*)
FROM
employees
WHERE department_id = 90 ;
end.