当前位置:Gxlcms > 数据库问题 > Oracle分页

Oracle分页

时间:2021-07-01 10:21:17 帮助过:3人阅读

      当将一条语句交给查询优化器处理时:

      如果排序列上有索引,则借助索引去查询数据,这样,读取出来的数据和rownum产生的序号是一种正常的对应关系,如语句一的结果(empno上有主键索引)。

     如果排序列上没有索引,则使用全表扫描的方式,依次从表中读取数据,读取完成后,最后进行排序,于是产生了类似语句二的结果(sal列上没有索引)。

     正是由于排序列上不一定有索引,所以在ORACLE中使用rownum伪列分页时,需要多加一层查询,以保证rownum序号的连续性。

语句三:select rownum,t.* from (select empno,sal from emp order by sal) t;

    ROWNUM      EMPNO        SAL

    ---------- ---------- ----------         

          1               7369        800         

          2               7900        950         

          3                7876       1100         

           4                7521      1250         

           5                7654      1250         

           6                 7934      1300         

           7                  7844      1500         

这个结果还满意吧。。。

分页:在外面再加上一层查询。

select * from (select rownum num,t.* from (select empno,sal from emp order by sal) t) where num between 6 and 10;

当然,如果使用分析函数row_number就可以省略一层查询了,代码更简单点:

select * from (select row_number() over (order by sal) num,empno,sal from emp) where num between 6 and 10;

 

Oracle分页

标签:

人气教程排行