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

2014-11-24 11:19:37 · 作者: · 浏览: 4
HERE子句中,Oracle也支持在FROM或HAVING子句中出现子查询。子查询比主查询先执行,结果作为主查询的条件,在书写上要用圆括号扩起来,并放在比较运算符的右侧。子查询可以嵌套使用,最里层的查询最先执行。子查询可以在SELECT、INSERT、UPDATE、DELETE等语句中使用。
子查询按照返回数据的类型可以分为单行子查询、多行子查询和多列子查询。

单行子查询
查询比SCOTT工资高的雇员名字和工资。
执行以下查询:

Sql代码
1.SELECT ename,sal FROM emp
2.WHERE sal>(SELECT sal FROM emp WHERE empno=7788);
SELECT ename,sal FROM emp
WHERE sal>(SELECT sal FROM emp WHERE empno=7788);
执行结果为:

Sql代码
1.ENAME SAL
2.-------------- --------------------
3.KING 5000
ENAME SAL
-------------- --------------------
KING 5000
说明:在该子查询中查询SCOTT的工资时使用的是他的雇员号,这是因为雇员号在表中是惟一的,而雇员的姓名有可能相重。SCOTT的雇员号为7788。
也可以包含两个或多个子查询。


Sql代码
1.在FROM从句中使用子查询
在FROM从句中使用子查询
在FROM从句中也可以使用子查询,在原理上这与在WHERE条件中使用子查询类似。有的时候我们可能要求从雇员表中按照雇员出现的位置来检索雇员,很容易想到的是使用rownum虚列。比如我们要求显示雇员表中6~9位置上的雇员,可以用以下方法。

查询雇员表中排在第6~9位置上的雇员。
执行以下查询:

Sql代码
1.SELECT ename,sal FROM (SELECT rownum as num,ename,sal FROM emp WHERE rownum<=9 )
2. WHERE num>=6;
SELECT ename,sal FROM (SELECT rownum as num,ename,sal FROM emp WHERE rownum<=9 )
WHERE num>=6;
执行结果为:

Sql代码
1.ENAME SAL
2. -------------- --------------------
3. BLAKE 2850
4. CLARK 2450
5. SCOTT 3000
6. KING 5000
ENAME SAL
-------------- --------------------
BLAKE 2850
CLARK 2450
SCOTT 3000
KING 5000
说明:子查询出现在FROM从句中,检索出行号小于等于9的雇员,并生成num编号列。在主查询中检索行号大于等于6的雇员。
注意:以下用法不会有查询结果
SELECT ename,sal FROM emp
WHERE rownum>=6 AND rownum<=9;

集合运算
多个查询语句的结果可以做集合运算,结果集的字段类型、数量和顺序应该一样。
Oracle共有4个集合操作

UNION:并集,合并两个操作的结果,去掉重复的部分
UNION ALL:并集,合并两个操作的结果,保留重复的部分
MINUS:差集,从前面的操作结果中去掉与后面操作结果相同的部分
INTERSECT:交集,取两个操作结果中相同的部分

使用集合的并运算
查询部门10和部门20的所有职务。
执行以下查询:

Sql代码
1.SELECT job FROM emp WHERE deptno=10
2. UNION
3. SELECT job FROM emp WHERE deptno=20;
SELECT job FROM emp WHERE deptno=10
UNION
SELECT job FROM emp WHERE deptno=20;


执行结果为:

Sql代码
1.JOB
2.---------
3.ANALYST
4.CLERK
5.MANAGER
6.PRESIDENT
JOB
---------
ANALYST
CLERK
MANAGER
PRESIDENT
说明:部门10的职务有PRESIDENT、MANAGER、CLERK;部门20的职务有MANAGER、CLERK、ANALYST。所以两个部门的所有职务(相同职务只算一个)共有4个:ANALYST、CLERK、MANAGER和PRESIDENT。
将UNION改为UNION ALL的结果为:把两条语句查出来的值全部都显示,不去掉重复值

使用集合的交运算
查询部门10和20中是否有相同的职务和工资。
执行以下查询:

Sql代码
1.SELECT job,sal FROM emp WHERE deptno=10
2. INTERSECT
3. SELECT job,sal FROM emp WHERE deptno=20;
SELECT job,sal FROM emp WHERE deptno=10
INTERSECT
SELECT job,sal FROM emp WHERE deptno=20;
执行结果为:
未选定行

说明:部门10的职务有PRESIDENT、MANAGER、CLERK;部门20的职务有MANAGER、CLERK、ANALYST。所以两个部门的相同职务为:CLERK和MANAGER。但是职务和工资都相同的雇员没有,所以没有结果。
使用集合的差运算
查询只在部门表中出现,但没有在雇员表中出现的部门编号。
执行以下查询:

Sql代码
1.SELECT deptno FROM dept
2.MINUS
3.SELECT deptno FROM emp ;
SELECT deptno FROM dept
MINUS
SELECT deptno FROM emp ;
执行结果为:

Sql代码
1.DEPTNO
2.------------------
3. 40
DEPTNO
------------------
40
说明:部门表中的部门编号有10、20、30和40。雇员表中的部门编号有10、20和30。差集的结果为40。