设为首页 收藏本站
查看: 607|回复: 0

[经验分享] ORACLE学习笔记系列(14)聚合函数

[复制链接]

尚未签到

发表于 2016-8-4 09:45:43 | 显示全部楼层 |阅读模式
  
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;
 
 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-252624-1-1.html 上篇帖子: oracle 11g PL/SQL Programming学习十二 下篇帖子: Oracle官方教程之Fork/Join
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表