Three-layer Paging
关键字Rownum总结:
1)rownum是oracle专用的关健字
2)rownum与表在一起,表亡它亡,表在它在
3)rownum在默认情况下,从表中是查不出来的
4)只有在select子句中,明确写出rownum才能显示出来
5)rownum是number类型,而且唯一连续
6)rownum最小值是1,最大值与总记录条数相同
7)rownum参与关系运算,通常rownum只用于<或<=关系运算
因为rownum是查询出结果后才加入序号生成的伪列,必须从1开始,所以只能用小于某个正整数或者等于1才会有结果;如果把这个伪列取别名作为一个子查询的实列,此时就可以嵌套用大于某个值实现分页。
oracle分页有通用写法,最简单的如假设查询表中5-9条记录:
select yy.* from
(select rownum ids,emp.* from emp where rownum<=9) yy
where ids>=5;
一般说来from后可能用真实表名,也可能用子查询看作的表名,同时真实表和子查询看作的表会做连接查询。而且很多时候,我们不会盲目的分页查找,一般先会按某一个或多个字段的升序或降序分页,即包含 order by 语句的分页查询。
select yy.*from
(select rownum ids,e.* from
(select * from emp order by name) e //第一层:排序
where rownum<=9) yy //第二层:定行号
where ids>=5; //第三层:分页过滤
这里不能忘了e.*,不然没有完整数据,rownum < 10和 ids > 5则表示分页的范围。还有一种写法:
select yy.*from
(select rownum ids,e.* from
(select * from emp order by name) e
) yy
where ids>=5 and ids<=9;
不过这种嵌套查询没用到oracle的外层条件内推机制,它只能将分页条件推到第二层,无法推到内层查询中,于是中间层会先查询出所有的数据,最后再外层分页过滤,效率会低很多。