oracle分页查询(面试)

ROWNUM

rowid与rownum虽都被称为伪列,但它们的存在方式是不一样的:

rowid是物理存在的,表示记录在表空间中的唯一位置ID,在DB中是唯一的。只要记录没被搬动过,rowid是不变的。

rowid相对于表来说又像表中的一般列,所以,以rowid为条件就不会有rownum那么莫名其妙的结果出现。

rownum是真正的伪列,不管是数据库中物理表,还是嵌套子查询都会有rownum这个伪列,rownum总是从1开始的,第一条不满足去掉的话,第二条的rownum又成了1。

另外还要注意:rownum不能以任何基表的名称作为前缀

目前表中的数据如下:


 

1.分页查询格式1:

oracle嵌套子查询也具有伪列,可以使用别名来区别物理表和嵌套子查询语句的rownum


 

在查询的最外层控制分页的最小值和最大值。查询语句如下:

①首先获取伪列,并取别名rn。注意:伪列必须要有别名,因为嵌套子查询也有伪列rownum

select t.*, rownum rn from employee t

②使用rn进行分页查询

select t1.* from (select t.*, rownum rn from employee t) t1 where t1.rn > 10 and t1.rn < 20;

思考:这里为什么不能使用如下SQL语句来进行分页查询,查询结果是什么?

select t.*,rownum from employee t where rownum > 10 and rownum < 20;

解释:详情查考oracle中rownum为什么不能使用>符号来进行比较

2.分页查询格式2:

select t2.*
  from (select t1.*, rownum rn
          from (select * from employee where rownum < 20) t1) t2
 where rn > 10

3.分页查询格式3:

考虑到多表联合情况,如果不介意在系统中使用HINT的话,可以将分页查询语句改为:

select /*FIRST_ROWS*/ *
  from (select t1.*, rownum rn
          from (select * from employee where rownum < 20) t1) t2
 where rn > 10

解释:HINT

猜你喜欢

转载自weigang-gao.iteye.com/blog/2359464