在from中使用子查询:
如上例Oracle复杂查询(二)最后一行,在from语句中使用子查询时,该子查询会被作为一个视图来对待,因此叫做内嵌视图,而且必须要给子查询制定别名!!
【注意:在给列取别名时可以加as,而给表加别名不可加as】
分页子查询:Oracle一共有三种 1、rownum 2、分析函数 3、rowid效率最高
一、rownum分页
第一步:先做子查询:select * from emp;
第二步:显示rownum【oracle分配的】
select a1.*,rownum rn from (select * from emp) a1;
第三步:显示6到10 号的数据
select a1.*,rownum rn from (select * from emp) a1 where rownum<=10; 【此处rownum不可用别名】
select * from ( select a1.*,rownum rn from (select * from emp) a1 where rownum<=10) where rn >=6;
【注意:不能直接写成select a1.*,rownum rn from (select * from emp) a1 where rownum<=10 and rownum>=6或者是用between and,都不可以,oracle 的分页一次只能使用一次,类似于二分法】
查询的变化
a、指定查询咧,只需要修改最里层的子查询
b、如何排序,只需要修改最里层的子查询
用查询结果创建新表;
create table mytable (id,name,sal,job,deptno) as select empno,ename,sal,job,deptno,from emp;
合并查询:【速度远远高于and,or等等】
有时候在实际应用中,为例合并多个select语句的结果,可以使用集合操作符union,union all ,intersect,minus;
(1)union
该操作用于取得两个结果集的并集,会自动去除结果集中的重复行,
select ename ,sal ,job from emp where sal >2500 union select ename ,sal ,job from emp where job ='manager'
(2)union all 与union相似,但不会取消重复行,而且不会排序。
select ename ,sal ,job from emp where sal >2500 union all select ename ,sal ,job from emp where job ='manager'
(3)intersect
使用该操作符用于取得两个结果集的交集
select ename ,sal ,job from emp where sal >2500
intersect select ename ,sal ,job from emp where job ='manager'
(4)minus
两个结果集的差集,会显示存在第一个集合中,而不存在第二个集合中的数据