统计查询

论坛 期权论坛 脚本     
匿名技术用户   2020-12-30 09:31   11   0

转自: http://www.cnblogs.com/junyuz/archive/2011/03/14/1983364.html


统计查询
通常需要对数据进行统计,汇总出数据库的统计信息。比如,我们可能想了解公司的总人数和总工资额,或各个部门的人数和工资额,这个功能可以由统计查询完成。
Oracle提供了一些函数来完成统计工作,这些函数称为组函数,组函数不同于前面介绍和使用的函数(单行函数)。组函数可以对分组的数据进行求和、求平均值等运算。组函数只能应用于SELECT子句、HAVING子句或ORDER BY子句中。组函数也可以称为统计函数。

组函数:
AVG:求平均值
COUNT:求计数值,返回非空行数,*表示返回所有行
MAX:求最大值
MIN:求最小值
SUM:求和
STDDEV:求标准偏差,是根据差的平方根得到的
VARIANCE:求统计方差

分组函数中SUM和AVG只应用于数值型的列,MAX、MIN和COUNT可以应用于字符、数值和日期类型的列。组函数忽略列的空值。
使用GROUP BY 从句可以对数据进行分组。所谓分组,就是按照列的相同内容,将记录划分成组,对组可以应用组函数。
如果不使用分组,将对整个表或满足条件的记录应用组函数。
在组函数中可使用DISTINCT或ALL关键字。ALL表示对所有非NULL值(可重复)进行运算(COUNT除外)。DISTINCT 表示对每一个非NULL值,如果存在重复值,则组函数只运算一次。如果不指明上述关键字,默认为ALL。

求有佣金的雇员人数。
执行以下查询:

Sql代码

1. SELECT COUNT(comm) FROM emp;


返回结果为:

Sql代码

1. COUNT(COMM)

  1. ---------------------
  2. 4


说明:在本例中,没有返回全部雇员,只返回佣金非空的雇员,只有4个人。

求雇员表中不同职务的个数。
执行以下查询:

Sql代码

1. SELECT COUNT( DISTINCT job) FROM emp;


返回结果为:

Sql代码

1. COUNT(DISTINCT JOB)

  1. -------------------------------
  2. 5


说明:该查询返回雇员表中不同职务的个数。如果不加DISTINCT,则返回的是职务非空的雇员个数。

分组统计
通过下面的训练,我们来了解分组的用法。
按职务统计工资总和。
步骤1:执行以下查询:

Sql代码

1. SELECT job,SUM(sal) FROM emp GROUP BY job;


执行结果为:

Sql代码

  1. JOB SUM(SAL)

2. ----------------- -------------------

3. ANALYST 6000

4. CLERK 4150

5. MANAGER 8275

6. PRESIDENT 5000

7. SALESMAN 5600



说明:分组查询允许在查询列表中包含分组列,对以上实例,因为是按职务job分组的,所以在查询列中可以包含job字段,使统计结果很清楚
职务为ANALYST的雇员的总工资为6000,职务为CLERK的雇员的总工资为4150,依此类推。
注意:在查询列中,不能使用分组列以外的其他列,否则会产生错误信息。

错误写法:SELECT ename,job,SUM(sal) FROM emp GROUP BY job;

多列分组统计
可以按多列进行分组,以下是按两列进行分组的例子。
按部门和职务分组统计工资总和。
执行以下查询:

Sql代码

1. SELECT deptno, job, sum(sal) FROM emp

2. GROUP BY deptno, job;


执行结果为:
DEPTNO JOB SUM(SAL)
------------------ --------- -----------------------
10 CLERK 1300
10MANAGER 2450
10 PRESIDENT 5000
20ANALYST 6000
20CLERK 1900
20MANAGER 2975
30CLERK 950
30MANAGER 2850
30SALESMAN 5600
说明:该查询统计每个部门中每种职务的总工资。
分组统计结果限定
对分组查询的结果进行过滤,要使用HAVING从句。HAVING从句过滤分组后的结果,它只能出现在GROUP BY从句之后,而WHERE从句要出现在GROUP BY从句之前。
统计各部门的最高工资,排除最高工资小于3000的部门。
执行以下查询:

Sql代码

1. SELECT deptno, max(sal) FROM emp

  1. GROUP BY deptno
  2. HAVING max(sal)>=3000;


执行结果为:

Sql代码

1. DEPTNO MAX(SAL)

  1. ------------------ ------------------
  2. 10 5000
  3. 20 3000


说明:结果中排除了部门30,因部门30的总工资小于3000。
注意:HAVING从句的限定条件中要出现组函数。如果同时使用WHERE条件,则WHERE条件在分组之前执行,HAVING条件在分组后执行。

分组统计结果排序
可以使用ORDER BY从句对统计的结果进行排序,ORDER BY从句要出现在语句的最后。
按职务统计工资总和并排序。
执行以下查询:

Sql代码

1. SELECT job 职务, SUM(sal) 工资总和 FROM emp

2. GROUP BY job

3. ORDER BY SUM(sal);


执行结果为:

Sql代码

1. 职务 工资总和

2. ---------------- ------------------

3. CLERK 4150

4. PRESIDENT 5000

5. SALESMAN 5600

6. ANALYST 6000

7. MANAGER 8275



组函数的嵌套使用
在如下训练中,使用了组函数的嵌套。
求各部门平均工资的最高值。
执行以下查询:

Sql代码

1. SELECT max(avg(sal)) FROM emp GROUP BY deptno;


执行结果为:

Sql代码

1. MAX(AVG(SAL))

  1. -----------------------
  2. 2916.66667

说明:该查询先统计各部门的平均工资,然后求得其中的最大值。
注意:虽然在查询中有分组列,但在查询字段中不能出现分组列。

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP