深入理解数据库当中的聚合函数

来源:互联网 发布:护眼台灯 知乎 编辑:程序博客网 时间:2024/06/11 04:20

核心内容:
1、聚合函数的相应概念
2、聚合函数的分类
3、聚合函数用法的注意事项
4、具体实例应用


1、聚合函数的相应概念

在数据库当中,函数分为两种:单行函数和多行函数,相应概念如下:
单行函数:每一行返回一个数值(如lower)
多行函数:多行返回一个数值(如count)
聚合函数:多行函数,即表中的多条记录返回至一个数值,通常用于分组的相关信息。

2、聚合函数的分类

聚合函数的分类:(常用的5个)
count:
count(*):统计表中所有记录的个数
count(列名):统计一列中值的个数,其中重复的记录也会被当做有效的记录。
count(distinct 列名):统计一列中值的个数,其中重复的记录只会被记录一次。
sum(列名):计算一列值的总和。
avg(列名):计算一列值的平均值。
max(列名):计算一列值中的最大值。
min(列名):计算一列值中的最小值。
我认为只要记住count为统计一列中值的个数就可以了,因为里面毕竟是distinct的用法。

3、聚合函数用法的注意事项

1、聚合函数同order by、distinct、top等都是一样的,都是作用于最终的结果集合的,而不是最用于单行元组的,所以在SQL语句的处理过程当中一定要分清该关键字是作用域单行记录的,还是作用于最终的结果集合的。
2、在聚合函数遇到空值的时候,除count(*)外,所有的聚合函数都会跳过空值而只处理非空值。
3、单行函数和多行函数不能混合使用。
4、如果未对查询结果进行分组,聚集函数将作用于整个查询结果,而分组后聚集函数将作用于每一个组,即每一个组都有一个函数值。

4、聚合函数的具体应用

1、在scott数据库当中,统计emp表中deptno不重复的记录的个数。
代码1:

select deptno from empwhere 1=1

运行结果:
这里写图片描述
具体执行顺序:
a.指定输入文件的路径,即查询所用的表emp表。(from emp)
b.然后拿到表中的第一条记录,通过where条件表达式进行相应的过滤。(where 1=1)
c.通过echo或者printf(即select)对表中的相应记录进行输出。
d.最后对表中的所有行记录进行相同的处理。
代码2:通过distinct关键字去除掉表中的重复的元组

select distinct deptno from empwhere 1=1

运行结果:
这里写图片描述
具体执行流程:
e.通过distinct关键字作用于最终的结果集合,去除掉表中重复的记录个数。
代码3:通过count关键字统计一列中值的个数。

select count (distinct deptno) "个数"from empwhere 1=1

运行结果:
这里写图片描述
流程:
f.通过count关键字作用于最终的结果集合,统计一列中数值的个数。
在上面当中,通过一个小例子讲述了数据库中聚合函数的处理数据的流程,实际上只要分清楚两点:
1、一定要明白SQL语句的具体执行流程
2、一定要明白该关键字到底是作用于单行元组还是作用于最终的结果集合的,凡是作用域最终的结果的,都是在编写SQL语句的过程当中最后才加上的。
下面通过几个SQL语句进一步理解聚合函数的概念–判断下面的SQL语句是否正确。
SQL语句1:

select max(sal) "最高工资",min(sal) "最低工资",count(*) "员工人数"from empwhere 1=1 

上面的语句到底是否执行成功呢?按照我们上面所说的逻辑分步骤进行处理:
代码1:(既然聚合函数是作用于最终的集合的,那我们就先将max、min、count这些聚合函数先去掉)

select sal,sal,*from empwhere 1=1 

运行结果:
这里写图片描述
代码2:通过max、min、count这些聚合函数作用于最终的结果集合。

select max(sal),min(sal),count(*)from empwhere 1=1 

运行结果:
这里写图片描述
代码3:改一下字段名吧

select max(sal) "最大值",min(sal) "最小值",count(*) "员工的个数"from empwhere 1=1 

运行结果:
这里写图片描述
因此上面的SQL语句是正确的。
SQL语句2:

select max(sal),lower (ename)from empwhere 1=1 

好的,我们还是先进行拆分处理。
代码1:先去掉作用于最终结果集合的聚合函数max

select sal,lower(ename)from empwhere 1=1

运行结果:
这里写图片描述
代码2:加上聚合函数max

select max(sal),lower(ename)from empwhere 1=1 

运行结果:(报错)

消息 8120,级别 16,状态 1,第 1 行选择列表中的列 'emp.ename' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。

上面的这个错误很明显,即单行行数和多行行数不能混合使用,所有上面的SQL语句是不正常的,所以还是那句话,在SQL语句的处理过程当中,只要分清该关键字作用于单行记录还是最终的结果集合就很简单了。
OK,至于聚合函数与分组的结合使用,后续在具体介绍,如有问题,欢迎留言指正!
后续:http://www.tuicool.com/articles/fERNv2
http://www.codeceo.com/article/sql-execute-process.html

1 0
原创粉丝点击