Oracle经典子查询及分页基础详解

             Oracle经典子查询及分页基础详解

 

一:

1.如何显示高于自己部门平均工资的员工的信息。

(1)查询出各个部门的平均工资和部门号。

select deptNO,avg(sal)mysal from emp group by deptNO;

(2)把上面的查询看成是一张子表。

select a2.ename,a2.sal,a2.deptNO,a1.mysal from emp a2,(select deptNO,avg(sal)mysal from emp group by deptNO) a1 where a2.deptNO=a1.deptNo and a2.sal>a1.mysal;

在from子句中使用子查询时,该子查询会被作为一个视图来对待,因此叫内嵌式视图,当在from子句中使用子查询时,必须给子查询指定别名。给表取别名不能加as。给列加别名可以加as。

 

2.oracle的分页一共有三种方式。(根据rowId,按分析函数来分,按rownum来分。)

(1) select a1.*,rownum rn from (select * from emp) a1;

注:rownum分页。rownum给每一行分配一个行号。

 

3.显示emp表的前十行:

(1)select a1.*,rownum rn from (select * from emp) a1 where rownum<=10;

(select * from emp)虚拟表可以看成个一个真实的表,where限制语句里面的条件需要是虚拟表里的面存在的。

注:这里rownum是红色部分表中隐含的列。可以通过下面查询语句进行验证

(2)select a2.*,rownum rn from (select a1.*,rownum from emp a1)a2 where rownum<=10;

注:这里rn不能做条件条件是之前就存在的,才能用作条件。

4.显示emp表5--10条:

select * from (select a1.*,rownum rn from (select * from emp) a1 where rownum<=10) where  rn>=6;

注: rownum在子查询中where之后只能出现一次,where  rownum>=5 and  rownum<=10是错的。

5.指定查询列,只需修改最里层的子查询。

select * from (select a1.*,rownum rn from (select ename,sal from emp) a1 where rownum<=10) where  rn>=6;

6.如何排序,只需修改最里层的子查询。

select * from (select a1.*,rownum rn from (select ename,sal from emp order by sal desc) a1 where rownum<=10) where  rn>=6;

7.显示第四条到第九条:

select * from (select a1.*,rownum rn from (select ename,sal from emp order by sal desc) a1 where rownum<=9) where  rn>=4;

查询其他的表的话,只可把表名给改了就行了。

8.显示emp表有多少行

select count(*)from emp;

9.用查询结果创建新表。这个命令是一种快捷的建表方法。

create table mytable(id,name,sal,job,deptNO) as select empNO,ename,sal,job,deptNO from emp;

10.合并查询。

union并集。该操作用于取得两个结果的并集。当使用该操作时,会自动去掉结果集中重复行。

select ename,sal,job from emp where sal>2500

union

select ename,sal,job from emp where job='MANAGER';

11.union all合并查询但不会去掉重复行。

12.minus,如果a包括b,那么显示a中除b的部分。

.

 

 

注:涉及子查询时.逻辑要清楚。根据查询语句相关的条件拆分分步击破。一层一层的由里到外击破。

 

posted @ 2012-07-21 23:18  shyscool  阅读(804)  评论(0编辑  收藏  举报