说道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