oracle多表联合查询,统计查询,组函数,order by,having,子查询(三)

2014-11-24 11:19:37 · 作者: · 浏览: 1
TINCT JOB)
-------------------------------
5
说明:该查询返回雇员表中不同职务的个数。如果不加DISTINCT,则返回的是职务非空的雇员个数。

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

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

Sql代码
1.SELECT deptno, max(sal) FROM emp
2. GROUP BY deptno
3. HAVING max(sal)>=3000;
SELECT deptno, max(sal) FROM emp
GROUP BY deptno
HAVING max(sal)>=3000;
执行结果为:

Sql代码
1.DEPTNO MAX(SAL)
2. ------------------ ------------------
3. 10 5000
4. 20 3000
DEPTNO MAX(SAL)
------------------ ------------------
10 5000
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);
SELECT job 职务, SUM(sal) 工资总和 FROM emp
GROUP BY job
ORDER BY SUM(sal);
执行结果为:

Sql代码
1.职务 工资总和
2.---------------- ------------------
3.CLERK 4150
4.PRESIDENT 5000
5.SALESMAN 5600
6.ANALYST 6000
7.MANAGER 8275
职务 工资总和
---------------- ------------------
CLERK 4150
PRESIDENT 5000
SALESMAN 5600
ANALYST 6000
MANAGER 8275

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

Sql代码
1.SELECT max(avg(sal)) FROM emp GROUP BY deptno;
SELECT max(avg(sal)) FROM emp GROUP BY deptno;
执行结果为:

Sql代码
1.MAX(AVG(SAL))
2. -----------------------
3. 2916.66667
MAX(AVG(SAL))
-----------------------
2916.66667
说明:该查询先统计各部门的平均工资,然后求得其中的最大值。
注意:虽然在查询中有分组列,但在查询字段中不能出现分组列。

子查询
我们可能会提出这样的问题,在雇员中谁的工资最高,或者谁的工资比SCOTT高。通过把一个查询的结果作为另一个查询的一部分,可以实现这样的查询功能。具体的讲:要查询工资高于SCOTT的雇员的名字和工资,必须通过两个步骤来完成,第一步查询雇员SCOTT的工资,第二步查询工资高于SCOTT的雇员。第一个查询可以作为第二个查询的一部分出现在第二个查询的条件中,这就是子查询。出现在其他查询中的查询称为子查询,包含其他查询的查询称为主查询。

子查询一般出现在SELECT语句的W