分组函数也称多行函数,用于对一组数据进行运算,针对一组数据(取自于多行记录的相同字段)只返回一个结果,例如计算公司全体员工的工资总和、最高工资、最低工资、各部门的员工平均工资(按部门分组)等。由于分组函数实际上提供的是数据统计功能,因此也称统计函数。Oracle常用分组函数如下所示:
常用分组函数
函数    功能说明                    适用类型
avg()    计算平均值                 数值型
count() 返回查询所得到的记录行数 任何类型数据
max()   计算最大值                     任何类型数据
min()    计算最小值                     任何类型数据
sum()   求和                              数值型
SELECT avg(sal), max(sal), min(sal), sum(sal) FROM emp;
SELECT max(hiredate), min(hiredate) FROM emp;
SELECT max(ename), min(ename) FROM emp;
对于字符型数据值,以字典顺序居后者为大;对于日期/时间型数据值,以较迟者为大;

count函数的用法相对复杂一些,其语法格式包括如下三种。
count(*) 返回组中总记录数目;
count(exp) 返回表达式exp值非空的记录数目;
count(DISTINCT(exp)) 返回表达式exp值不重复的、非空的记录数目。
例如 ,下述SELECT语句分别实现了查询emp表中总记录行数(雇员总数)、查询comm字段值非空的记录行数(补助非空的雇员人数)、查询deptno字段值不重复且非空的记录行数(部门数目,当前共有编号分别为10、20和30的3个不同部门)等功能。
SELECT count(*) FROM emp;
SELECT count(comm) FROM emp;
SELECT count(DISTINCT(deptno)) FROM emp;

分组函数中的空值
由于分组函数返回的结果是不是基于单行数据、而是基于行组(多行数据)计算所得到的,因此分组函数与单行函数差别较大,在空值数据的处理方面也是如此。除COUNT(*)以外的所有分组函数均忽略空值。例如下述语句:

SELECT * FROM emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
7369 SMITH CLERK7902 1980/12/17 800.00 20
7499 ALLEN SALESMAN7698 1981/2/20 1600.00 300.00 30
7521 WARD SALESMAN7698 1981/2/22 1250.00 500.00 30
7566 JONES MANAGER7839 1981/4/2 2975.00 20
7654 MARTIN SALESMAN7698 1981/9/28 1250.00 1400.00 30
7698 BLAKE MANAGER7839 1981/5/1 2850.00 30
7782 CLARK MANAGER7839 1981/6/9 2450.00 10
7788 SCOTT ANALYST7566 1987/4/19 3000.00 20
7839 KING PRESIDENT 1981/11/17 5000.00 10
7844 TURNER SALESMAN7698 1981/9/8 1500.00 0.00 30
7876 ADAMS CLERK 7788 1987/5/23 1100.00 20
7900 JAMES CLERK 7698 1981/12/3 30
7902 FORD ANALYST7566 1981/12/3 3000.00 20
7934 MILLER CLERK 7782 1982/1/23 1300.00 10
SELECT sum(comm), avg(comm) FROM emp;
SUM(COMM) AVG(COMM)
2200 550
SELECT COUNT(*),COUNT(COMM) FROM EMP;
COUNT(*) COUNT(COMM)
14 4

从中可以看出,分组函数sum(comm)只是对不为空的comm字段值进行求和(300+500+1400+0),相当于过滤掉/忽略了所有comm字段值为空的记录行。avg(comm)的情况类似,其效果等价于sum(comm)/count(comm),而不是sum(comm)/count(*)。类似地,如果分组函数的参数为表达式(不是单一的字段),则忽略表达式结果中的空值,例如:

SELECT sum(sal), sum(comm), sum(sal+comm), sum(sal)+sum(comm) FROM emp;
其中sum(sal+comm)统计的是工资与补助均不为空值的员工的总收入(如果sal、comm中有一个为空值NULL,则该行忽略不计),sum(sal) + sum(comm)统计的是工资不为空的员工的工资总和加上补助不为空的员工的补助总和。
如果分组函数查询中,没有返回行或只有空值(分组函数的参数表达式均为空值),则分组函数返回空值。例如:
DROP TABLE e1;
CREATE TABLE e1(name VARCHAR2(20), sal NUMBER(8,2));
--分组中包含0行记录,分组函数sum(sal)和avg(sal)均返回空值
SELECT sum(sal), avg(sal) FROM e1;
--INSERT INTO e1 VALUES('RUSKY',NULL);
--INSERT INTO e1 VALUES('RUSKY2',NULL);
--分组中包含记录,但因其sal字段均为空值、被sum(sal)及avg(sal)函数忽略,返回空值

SELECT sum(sal), avg(sal) FROM e1; --返回空值
--INSERT INTO e1 VALUES('RUSKY3',1000);
SELECT * FROM e1
NAME SAL
RUSKY
RUSKY2
RUSKY3 1000.00
SELECT SUM(SAL),AVG(SAL),COUNT(SAL) FROM e1;
SUM(SAL) AVG(SAL) COUNT(SAL)
1000 1000 1
SELECT SUM(SAL),AVG(SAL),COUNT(SAL) FROM e1;
SUM(SAL) AVG(SAL) COUNT(SAL)
1000 1000 1

在实际应用中,如果需要将空值(空值字段对应的记录行)纳入到统计计算中,则可使用nvl函数将空值字段(或表达式)转换为指定的值(通常为0),然后再进行计算,例如:
SELECT SUM(NVL(SAL,0)),AVG(NVL(SAL,0)) FROM e1;
SUM(NVL(SAL,0)) AVG(NVL(SAL,0))
1000 333.333333333333

分组函数中的重复值
除COUNT(*)外的所有分组函数均自动忽略空值。需要的话,还可以在除COUNT(*)外的分组函数中使用DISTINCT关键字过滤重复值,其语法格式为:
<分组函数名>(DISTINCT(<参数表达式>))
实际上,这些分组函数中还可以使用另一个与DISTINCT相对应的关键字ALL,即不对重复值进行过滤(缺省选项,因此一般没有人显式设置它),例如:

--DROUP TABLE e1
--CREATE TABLE E1(NAME VARCHAR2(20),SAL NUMBER(8,2));
/*INSERT INTO E1 VALUES('RUSKY1',2000);
INSERT INTO E1 VALUES('RUSKY2',2000);
INSERT INTO E1 VALUES('RUSKY3',1000);*/
SELECT * FROM E1
NAME SAL
RUSKY1 2000.00
RUSKY2 2000.00
RUSKY3 1000.00
SELECT COUNT(SAL),SUM(SAL),AVG(SAL) FROM E1;
COUNT(SAL) SUM(SAL) AVG(SAL)
3 5000 1666.66666666667
SELECT COUNT(ALL(SAL)),SUM(ALL(SAL)),AVG(ALL(SAL)) FROM E1;
COUNT(ALL(SAL)) SUM(ALL(SAL)) AVG(ALL(SAL))
3 5000 1666.66666666667
SELECT COUNT(DISTINCT(SAL)),SUM(DISTINCT(SAL)),AVG(DISTINCT(SAL)) FROM E1;
COUNT(DISTINCT(SAL)) SUM(DISTINCT(SAL)) AVG(DISTINCT(SAL))
2 3000 1500

  

常用分组函数count-avg-sum-max-min的更多相关文章

  1. 6.组函数(avg(),sum(),max(),min(),count())、多行函数,分组数据(group by,求各部门的平均工资),分组过滤(having和where),sql优化

     1组函数 avg(),sum(),max(),min(),count()案例: selectavg(sal),sum(sal),max(sal),min(sal),count(sal) from ...

  2. SQL--合计函数(Aggregate functions):avg,count,first,last,max,min,sum

    SQL--合计函数(Aggregate functions):avg,count,first,last,max,min,sum avg() 函数 定义和用法 AVG 函数返回数值列的平均值.NULL ...

  3. Linq查询Count、Sum、Min、Max、Average

    原文地址:Linq——Count.Sum.Min.Max.Average作者:mousekitty Linq查询之Count.Sum.Min.Max.Average using System; usi ...

  4. 74.Python中ORM聚合函数详解:Max,Min

    Max和Min:获取指定对象的最大值和最小值. 1. 比如:想要获取Author表中的最大的年龄和最小的年龄.示例代码如下: from django.http import HttpResponse ...

  5. Linq to SQL -- Select、Distinct和Count、Sum、Min、Max、Avg

    Select/Distinct操作符 适用场景:o(∩_∩)o… 查询呗. 说明:和SQL命令中的select作用相似但位置不同,查询表达式中的select及所接子句是放在表达式最后并把子句中的变量也 ...

  6. Linq——Count、Sum、Min、Max、Average

    using System; using System.Data; using System.Configuration; using System.Linq; using System.Web; us ...

  7. 线段树-sum/max/min/区间更新

    写一个板子. #include <cstdio> #include <algorithm> using namespace std; +; #define ROOT 1, 1, ...

  8. Mysql聚合函数count(1) sum(1)结果返回0和NULL

    1.count(1) 返回为0 如果所查询的表或者where条件筛选后得到的结果集为空,则 count(1)返回为 0 如: select count(id) from test; select co ...

  9. EF 汇总函数使用注意事项Max()/Min()等

    一.字符串类型最大值 1.字符串类型的最大值,和数据库的字典排序最后一个相同,如果存在返回null //字符串最大值,是字典排序最后一个 string max1 = _context.students ...

随机推荐

  1. java BigDecimal的操作

    今天给大家讲一下java中BigDecimal的操作.由于double,float的精度不够,因此在进行商业计算的时候要使用的BigDecimal.BigDecimal对象创建如下: BigDecim ...

  2. 汇编笔记之 ret 、retf和call

    作用: ret  将 栈顶数据出栈到IP retf 将 栈顶数据出栈到IP ,然后再次将栈顶数据出栈到CS 这样一来,可以使程序跳转到已经定义好了的代码段去执行. call 语法 call s0 (如 ...

  3. POP动画引擎中Layer与CALayer的一点区别

    POP动画引擎是facebook提供的一个开源框架, 可以实现很多的动画效果, 这里就不一一介绍啦, 有兴趣的童鞋请移步: https://github.com/facebook/pop 下面简单的讲 ...

  4. PHP Sessions

    PHP Sessions PHP session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置.Session 变量存储单一用户的信息,并且对于应用程序中 ...

  5. (二)Knockout - ViewModel 的使用

    计算属性 实际应用中,我们通常需要对数据进行加工 如: 指定日期格式,将数字相加... 等,此时可使用ko.computed().当数据发生改变是,KO会使用computed重新计算 DEMO1 更改 ...

  6. 启动mySQL安装出现1067错误

    可能几种的办法: 删除data目录下的ib_logfile0和ib_logfile1 查看my.ini文件中的dir设置 查看err文件,如果是temp出现错误文件,则添加temp文件的路径

  7. hdu2112(HDU Today 简单最短路)

    Problem Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这时候,XHD ...

  8. jS放大镜效果

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="demo4.aspx.cs& ...

  9. 2.1 Java I/O简史

    Java 1.0 到 1.3 中的 IO 没有而 Java 1.4 中引入的 NIO 有的“改进”:非阻塞IO.缓冲区.通道层.字符集.内存数据.Perl(正则表达式之王): 下一代 I/O-NIO. ...

  10. 怎么把QQ我的收藏表情图片转移到另一台电脑上

    把收藏的QQ表情从一台电脑转移到另一台电脑的操作步骤如下:    1.在有表情的电脑登陆QQ,随便打开一个聊天窗口,点击[表情],选择[表情设置],点击[导入导出表情包],选择[导出全部表情包]:   ...