文章内容索引:
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后的字段。如果不明白不要紧,我们以后再讲。

三、秘术の训炼!

学习完了分组函数,我们可以做一些练习实验一下。(数据库可以自己建立,够实验用就好)

  1. 查询员工的工资的最大值,最小值,平均值,总和。
  2. 查询员工表中最大入职时间和最小入职时间的相差天数(datediff()函数)。
  3. 查询部门编号为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.