求助:oracle分组函数详解

[复制链接]
查看11 | 回复3 | 2007-9-26 18:42:10 | 显示全部楼层 |阅读模式
各位大虾好,我想了解一下oracle的分组函数可否帮我解释一下并给几个例子,非常感谢!
回复

使用道具 举报

千问 | 2007-9-26 18:42:10 | 显示全部楼层
我也想了解,只是知道是varray
回复

使用道具 举报

千问 | 2007-9-26 18:42:10 | 显示全部楼层
第六章 综合数据和分组函数
分组函数是对一批(一组)数据进行操作(综合)之后返回一个值。这批数据可能是整个表,也可能是按某种条件把该表分成的组。不少专家认为对于管理者或决策者来说综合数据才是最有价值的信息。例如:对于一个大型企业的老总,他/她可能对企业的平均工资很感兴趣,但对该企业中每个员工的具体工资就没什么兴趣了。
6.1 五个常用的分组函数
ORACLE常用的分组函数有以下五个:
Ø
COUNT
Ø
AVG
Ø
SUM
Ø
MAX
Ø
MIN
下面我们来分别介绍这五个分组函数。
6.2COUNT函数
我们首先介绍COUNT函数。COUNT的格式如下:
Ø
COUNT({*[ DISTINCT|ALL]表达式}: 该函数返回查寻的行数。
我继续第二章开始时的例子。假设你的老板在决定把谁炒尤鱼之前,想知道公司里到底有多少员工。你可以使用例6-1的查寻语句来完成他的重托: (在学习ORACLE时,你要想象使用ORACLE数据库管理系统的公司规模可能很大,例如该公司有一百多万名员工。这样你就可以比较容易地理解所讨论的问题了。)
例6-1
SQL> SELECT COUNT(*)
2FROM emp;
例6-1结果
COUNT(*)
----------
14
COUNT(*)返回表中所有的行包括空行和重复的行。
如果你的老板想知道公司里有多少员工有经理管理(不属于高级管理层)。你可能用例6-2的查寻语句来完成他的这一重托:
例6-2
SQL> SELECT COUNT(mgr)
2FROM emp;
例6-2结果
COUNT(MGR)
----------
13
所谓有经理管理的员工就是mgr不为空(NULL)的员工。因为COUNT(表达式) 返回表中所有表达式 为非空的行,所以COUNT(mgr) 返回表中所有mgr为非空的行,即有经理管理的员工的人数。
6.3AVG 和SUM函数
介绍完了COUNT函数之后,现在我们来讨论AVE 和SUM函数。
AVG函数的格式如下:
Ø
AVG([DISTINCT|ALL]表达式): 该函数返回表达式的平均值。
SUM函数的格式如下:
Ø
SUM([DISTINCT|ALL]表达式):
该函数返回表达式的总合。

现在假设你的老板还想知道公司的员工的平均工资和工资总合,你就可以使用如下的查寻语句(例6-3)来完成他的要求:
例6-3
SQL> SELECT AVG(sal) "Average Salary", SUM(sal) "Summary", COUNT(sal) "Records"
2FROM emp;
例6-3结果
Average SalarySummaryRecords
-------------- ---------- ----------
2073.2142929025 14
在例6-3的查寻语句中,你为每一列给出了一个有意义的别名,这一点在工作中也许很重要,特别当你的查寻结果或报告是拿给非计算机专业人员看时。在工作中要牢牢记住:“客户永远是我们的上帝”。看你报告的人就是客户,就是上帝。如果上帝不满意了,你的饭碗就难保了。

6.4MIN和MAX函数
介绍完了AVE 和SUM函数之后,现在我们来讨论MAX 和MIN函数。
MAX函数的格式如下:
Ø
MAX([DISTINCT|ALL]表达式):
该函数返回表达式的最大值。
MIN函数的格式如下:
Ø
MIN([DISTINCT|ALL]表达式):
该函数返回表达式的最值。
如过你的老板现在还想知道公司中员工的最低工资和最高工资,你可以使用下例的查寻语句(例6-4)来完成他的这一要求:
例6-4
SQL> SELECT MIN(sal) "Lowest Salary", MAX(sal) "Highest Salary"
2FROM emp;
例6-4结果
Lowest Salary Highest Salary
------------- --------------

800 5000
不像AVE和SUM函数只能操作数字型数据,MIN和MAX函数不但可用于数字型数据而且还可以用于字符型数据和日期型数据。例6-5的查寻语句就是一个MIN和MAX函数用于字符型数据的例子:
例6-5
SQL> SELECT MIN(job), MAX(job)
2FROM emp;
例6-5结果
MIN(JOB)MAX(JOB)
--------- ---------
ANALYST SALESMAN
假设你的老板又想知道公司雇佣的第一个员工的日期和公司雇佣的最后一个员工的日期,你就可以使用例6-6的查寻语句来完成他的这一新要求:
例6-6
SQL> SELECT MIN(hiredate) "First Day", MAX(hiredate) "Last Day"
2FROM emp;

例6-6结果
First DayLast Day
---------- ----------
17-12月-80 23-5月–87
在前面几节中,我们都是把一个表看成一个大组来处理。我们可以使用GROUP BY 子句把一个表化分成若干个组。在一个表中建立多组数据
6.5GROUP BY子句的应用
如过你的老板现又想知道公司中,按职位(JOB)分类,每类员工的平均工资,你可能用例6-7的查寻语句来完成他的这一要求:
例6-7
SQL> SELECT job, AVG(sal) "Average Salary"
2FROM emp
3GROUP BY job;
例6-7结果
JOB Average Salary
--------- --------------
ANALYST
3000
CLERK
1037.5
MANAGER 2758.33333
PRESIDENT 5000
SALESMAN
1400
例6-7的结果显示除了总裁(PRESIDENT)以外,分析员(ANALYST)的工资最高。公司可以根据这一信息重组一些职位(JOB),例如将分析员的一些简单的工作分给文员(CLERK)来做。这样就可以解雇一些多余的分析员,从而为公司节省一些开销。
摘自:《从实践中学习Oracle/SQL》,清华大学出版社出版。
回复

使用道具 举报

千问 | 2007-9-26 18:42:10 | 显示全部楼层
谢谢楼上的详细解说了啊!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行