ORACLE学习笔记系列(14)聚合函数


ORACLE学习笔记系列(14)聚合函数

 

常用的聚合函数

 

1、计数 COUNT()函数
COUNT()函数用来计算表中记录的个数(count(*))或者列中值的个数(count(column)),计算内容由SELECT语句指定。
使用COUNT函数时,必须指定一个列的名称或者使用星号,星号表示计算一个表中的所有记录。
两种使用形式如下。
    COUNT(*),计算表中行的总数,即使表中行的数据为NULL,也被计入在内。
    COUNT(column),计算column列包含的行的数目,如果该列中某行数据为NULL,则该行不计入统计总数。
注意:COUNT()函数只对那些传递到函数(括号)中的参数不是NULL的行计数。
      Select count(1) 和Select count(*) 返回的结果一样。

(1)使用COUNT(*)函数对表中的行数计数。
COUNT(*)函数将返回满足SELECT语句的WHERE子句中的搜索条件的函数。
--例如 查询EMP表中的所有记录的行数。
SELECT COUNT(*) FROM EMP;
在该例中,SELECT语句中没有WHERE子句,那么认为表中的所有行都满足SELECT语句,所以SELECT语句将返回表中所有行的计数。
如果DBMS在其系统表中存储了表的行数,COUNT(*)将很快地返回表的行数,
因为这时, DBMS不必从头到尾读取表,并对物理表中的行计数,而直接从系统表中提取行的计数。
而如果DBMS没有在系统表存储表的行数,将具有NOT NULL约束的列作为参数,使用COUNT函数,则可能更快地对表行计数。

(2)使用COUNT(column)函数对一列中的数据计数。
COUNT(column)函数可用于对一列中的数据值计数。
与忽略了所有列的COUNT(*)函数不同,COUNT(column)函数逐一检查一列(或多列)中的值,并对那些值不是NULL的行计数。
--例如 查询一列中所有记录的行数
SELECT COUNT(EMP.NAME) FROM EMP;

(3)使用COUNT(column)函数同时对多列中的数据计数
COUNT(column )函数不仅可用于对一列中的数据值计数,也可以对多列中的数据值计数。
如果对多列计数,则需要将要计数的多列连接后,作为COUNT(column )函数的参数。
--例如 使用COUNT(column )函数对多列中的数据计数
SELECT COUNT(EMP.ID), --id不为空的记录个数
       COUNT(EMP.SALARY), --deptname不为空的记录个数 
       COUNT(CAST(EMP.ID AS INT) + EMP.SALARY), --两者都不为空的个数
       COUNT(SYSDATE + 2)
  FROM EMP;
 
在进行两列的连接时,如果它们的数据类型不一致,要使用CAST表达式将它们转换成相同的数据类型。
因为使用的是“+”运算符,所以两列的数据类型必须都是数值类型,或能进行“+”运算。
如果在被连接的列中的任何一列有NULL值时,那么连接的结果为NULL,则该列不会被 COUNT( )函数计数。
原理:任何数值 + NULL 都等于 NULL


2、求和 SUM()函数
求和函数SUM( )用于对数据求和,返回选取结果集中所有值的总和。
语法如下:
SELECT SUM(COLUMN_NAME) FROM TABLE_NAME;

说明: 适用范围:SUM()函数只能作用于数值型数据,即列column_name中的数据必须是数值型的。
对NULL值的处理:当对某列数据进行求和时,如果该列存在NULL值,则SUM函数会忽略该值。
示例:查找员工总工资大于10000的部门
SELECT DEPTNAME, SUM(SALARY)
  FROM EMP
 GROUP BY EMP.DEPTNAME
HAVING SUM(SALARY) > 10000
 ORDER BY DEPTNAME;


3、求平均值 AVG()
函数AVG()用于计算一列中数据值的平均值。
语法如下:
SELECT AVG(COLUMN_NAME) FROM TABLE_NAME;
 
适用范围:与SUM( )函数一样,AVG()函数只能作用于数值型数据,即列column_name中的数据必须是数值型的。
对NULL值的处理:在计算平均值时,AVG()函数将忽略NULL值。
AVG()函数的执行过程实际上是将一列中的值加起来,再将其和除以非NULL值的数目,等价于sum(column)/ count(column)。
如果在某列中,所有行的值都是NULL,则AVG()函数将返回NULL值。
示例:
SELECT AVG(SALARY) AS AVG1,
       SUM(SALARY) / COUNT(*) AS AVG2,
       SUM(SALARY) / COUNT(SALARY) AS AVG3
  FROM EMP;
 
实际上,“avg(salary)”与“sum(salary)/count(salary)”语句是等价的。
因为avg(salary)语句的执行过程实际上是将salary列中的值加起来,再将其和除以非NULL值的数目(也就等价于count(salary))。
而语句“sum(salary) / count(*)”则不然,因为 COUNT(*) 返回的是表中所有记录的个数,而不管salary列中的数值是否为NULL。

 

4、求最大值 MAX(),最小值 MIN()
当需要了解一列中的最大值时,可以使用MAX()函数;同样,当需要了解一列中的最小值时,可以使用MIN()函数。
语法如下:
SELECT MAX(COLUMN_NAME), MIN(COLUMN_NAME) FROM TABLE_NAME;
 
适用范围:列column_name中的数据可以是数值、字符串或是日期时间数据类型。
MAX()/MIN()函数将返回与被传递的列同一数据类型的单一值。
对 NULL 值的处理:确定列中的最大值(最小值)时,MAX、MIN 函数忽略 NULL 值。
但是, 如果在该列中,所有行的值都是 NULL,则 MAX、MIN 函数将返回 NULL 值。
示例:获得各种工作的最高工资和最低工资
SELECT JOB, MAX(SALARY), MIN(SALARY) FROM EMP GROUP BY JOB;
 
注意:
在字符串数据类型中使用 MAX 和 MIN 时,对字符型数据的最大值,是按照首字母由 A~Z 的顺序排列,越往后,其值越大。
对于汉字则是按照其全拼拼音排列的,若首字符相 同,则比较下一个字符,以此类推,返回结果的数据类型为字符型数据。
在日期数据类型中使用 MAX 和 MIN 时,对日期时间类型的数据也可以求其最大/最小值,
其大小排列就是日期时间的早晚,越早认为其值越小,返回结果的数据类型为日期型。

 

5、聚合函数的重值处理
前面介绍的几种聚合函数,可以作用于所选列中的所有数据(不管列中的数据是否有重置),
也可以只对列中的非重值进行处理,即把重复的值只取一次进行聚合分析。
当然,对 于 MAX()/MIN()函数来讲,重值处理意义不大。
可以使用 ALL 关键字指明对所选列中的所有数据进行处理,
使用 DISTINCT 关键字指明对所选列中的非重值数据进行处理。

以 COUNT()函数为例,语法如下。
SELECT COUNT([ ALL / DISTINCT ] COLUMN_NAME) FROM TABLE_NAME;
 
说明:[ALL/DISTINCT]在缺省状态下,默认是 ALL 关键字,即不管是否有重 值,处理所有数据。
其他聚合函数的用法与此相同。

例如查询部门名称列中存在的不同记录的数目:
SELECT COUNT(DISTINCT EMP.DEPTNAME) FROM EMP;
 
 

你可能感兴趣的:(oracle学习)