oracle分组函数详解(转)
2008-01-17 09:28
第六章 综合数据和分组函数
分组函数是对一批(一组)数据进行操作(综合)之后返回一个值。这批数据可能是整个表,也可能是按某种条件把该表分成的组。不少专家认为对于管理者或决策者来说综合数据才是最有价值的信息。例如:对于一个大型企业的老总,他/她可能对企业的平均工资很感兴趣,但对该企业中每个员工的具体工资就没什么兴趣了。 6.1 五个常用的分组函数 ORACLE常用的分组函数有以下五个: Ø COUNT Ø AVG Ø SUM Ø MAX Ø MIN 下面我们来分别介绍这五个分组函数。 6.2 COUNT函数 我们首先介绍COUNT函数。COUNT的格式如下: Ø COUNT({*[ DISTINCT|ALL]表达式}: 该函数返回查寻的行数。 我继续第二章开始时的例子。假设你的老板在决定把谁炒尤鱼之前,想知道公司里到底有多少员工。你可以使用例6-1的查寻语句来完成他的重托: (在学习ORACLE时,你要想象使用ORACLE数据库管理系统的公司规模可能很大,例如该公司有一百多万名员工。这样你就可以比较容易地理解所讨论的问题了。) 例6-1 SQL> SELECT COUNT(*) 2 FROM emp; 例6-1结果 COUNT(*) ---------- 14 COUNT(*)返回表中所有的行包括空行和重复的行。 如果你的老板想知道公司里有多少员工有经理管理(不属于高级管理层)。你可能用例6-2的查寻语句来完成他的这一重托: 例6-2 SQL> SELECT COUNT(mgr) 2 FROM emp; 例6-2结果 COUNT(MGR) ---------- 13 所谓有经理管理的员工就是mgr不为空(NULL)的员工。因为COUNT(表达式) 返回表中所有表达式 为非空的行,所以COUNT(mgr) 返回表中所有mgr为非空的行,即有经理管理的员工的人数。 6.3 AVG 和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" 2 FROM emp; 例6-3结果 Average Salary Summary Records -------------- ---------- ---------- 2073.21429 29025 14 在例6-3的查寻语句中,你为每一列给出了一个有意义的别名,这一点在工作中也许很重要,特别当你的查寻结果或报告是拿给非计算机专业人员看时。在工作中要牢牢记住:“客户永远是我们的上帝”。看你报告的人就是客户,就是上帝。如果上帝不满意了,你的饭碗就难保了。 6.4 MIN和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" 2 FROM 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) 2 FROM emp; 例6-5结果 MIN(JOB) MAX(JOB) --------- --------- ANALYST SALESMAN 假设你的老板又想知道公司雇佣的第一个员工的日期和公司雇佣的最后一个员工的日期,你就可以使用例6-6的查寻语句来完成他的这一新要求: 例6-6 SQL> SELECT MIN(hiredate) "First Day", MAX(hiredate) "Last Day" 2 FROM emp; 例6-6结果 First Day Last Day ---------- ---------- 17-12月-80 23-5月–87 在前面几节中,我们都是把一个表看成一个大组来处理。我们可以使用GROUP BY 子句把一个表化分成若干个组。在一个表中建立多组数据 6.5 GROUP BY子句的应用 如过你的老板现又想知道公司中,按职位(JOB)分类,每类员工的平均工资,你可能用例6-7的查寻语句来完成他的这一要求: 例6-7 SQL> SELECT job, AVG(sal) "Average Salary" 2 FROM emp 3 GROUP 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》,清华大学出版社出版。 |