oracle 分页查询

 

说道oracle分页,不得不提一个字段

rownum:
 1 oracle下select语句每个结构集都有一个伪字段存在,叫做rownum,用于标识每条记录的行号
 2 从1开始,单次递增1,
 3 只有<,<=,没有 =,>,>=(据说是为了效率考虑做的限制)
 4 在查询取数据时产生序号,按照默认的顺序生成
 5 基于 rownum不能实现 >, >=, =的操作,我们可以利用
 5.1 用子查询将需要查询的字段放在临时表,同时将rownum这个临时字段用别名eg:r方式存储在临时表
 5.2 去临时表中查询,此时临时表的 rownum已经不再是临时字段,因此利用此字段实现分页查询  eg:  2=< r <=9
 

看如下的处理结果,已经将rownum按照sal降序后规则显示

select rownum ,ename, sal from (select * from emp order by sal desc)

ROWNUM ENAME SAL
1 Tom_ABCD 6000
2 KING 5000
3 FORD 3000
4 SCOTT 3000
5 JONES 2975
6 BLAKE 2850
7 CLARK 2450
8 ALLEN 1600
9 TURNER 1500
10 MILLER 1300
11 WARD 1250
12 MARTIN 1250
13 ADAMS 1100
14 JAMES 950
15 SMITH 800



然后在去上面表中查询,将rownum作为业务字段(非临时字段)执行 >= <=操作
select r,ename, sal from (select rownum r,ename, sal from (select * from emp order by sal desc)) where r >= 5 and r<=9;  (oracle实现分页 是通过嵌套行号最终作为非伪列字段方式来实现)

 

R ENAME SAL
5 JONES 2975
6 BLAKE 2850
7 CLARK 2450
8 ALLEN 1600
9 TURNER 1500


 
 
 当rownum 和  order by一起使用时,会首先处理rownum的条件,然后在进行排序,这个方式肯定不是我们需呀的。
 
 
 相对于oracle, mysql分页就简单的多:
 select * from emp order by  sal desc limit 5,10;

 

 

查看下面操作,感受下rownum:

select rownum,empno,ename,sal from emp order by sal desc;

ROWNUM EMPNO ENAME SAL
1 1001 Tom_ABCD 6000
10 7839 KING 5000
14 7902 FORD 3000
9 7788 SCOTT 3000
5 7566 JONES 2975
7 7698 BLAKE 2850
8 7782 CLARK 2450
3 7499 ALLEN 1600
11 7844 TURNER 1500
15 7934 MILLER 1300
4 7521 WARD 1250
6 7654 MARTIN 1250
12 7876 ADAMS 1100
13 7900 JAMES 950
2 7369 SMITH 800

 

上面的排序后,rownum是不会随着排序后的变化而变化的(这个数值生成后就固定,不会变更,可以类比理解为  name字段,zhangsan, lisi, wangwu....)

 

如果用下面这种查询方式,永远只能将 Tom_ABCD, ALLEN,SMITH 这三个人查出来

select rownum,empno,ename,sal from emp  where rownum <=3 order by sal desc;

ROWNUM EMPNO ENAME SAL
1 1001 Tom_ABCD 6000
3 7499 ALLEN 1600
2 7369 SMITH 800

 

 

 

 

 

 

 

你可能感兴趣的:(oracle)