博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Oracle分页
阅读量:6501 次
发布时间:2019-06-24

本文共 1247 字,大约阅读时间需要 4 分钟。

先看以下两条语句的执行结果:

语句一:select rownum,empno,sal from emp order by empno;

  ROWNUM      EMPNO        SAL

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

      1       7369         800         

      2       7499       1600         

      3       7521       1250         

      4       7566       2975         

       5       7654       1250         

       6       7698       2850         

       7       7782       2450         

       8       7788       3000

语句二:select rownum,empno,sal from emp order by sal;

    ROWNUM      EMPNO        SAL

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

         1       7369        800        

       12       7900        950        

       11       7876       1100         

         3       7521       1250         

         5       7654       1250        

        14       7934       1300        

        10       7844       1500         

          2       7499       1600

      同样的两个语句,执行结果中的rownum伪列的值却大相径庭,这是什么原因呢?其实这都是ORACLE内部的查询优化器和索引搞的鬼!

      rownum伪列产生的序号是按照数据被查询出来的顺序添加上去的,第一条是1,第二条是2,依次加1。

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

      如果排序列上有索引,则借助索引去查询数据,这样,读取出来的数据和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;

 

转载地址:http://fcvyo.baihongyu.com/

你可能感兴趣的文章
bzoj 2733 平衡树启发式合并
查看>>
sublime简书安装配置
查看>>
爱上MVC~Web.Config的Debug和Release版本介绍
查看>>
python__高级 : 动态添加 对象属性, 类属性, 对象实例方法, 类静态方法, 类方法...
查看>>
NLog的介绍使用
查看>>
括号和出栈所有序列问题
查看>>
第一次操刀数据库分表的教训与经验
查看>>
录音声音小
查看>>
Ubuntu 12.04 安装 Chrome浏览器
查看>>
java 反射
查看>>
ORACLE物化视图(物理视图)
查看>>
android 读取json数据(遍历JSONObject和JSONArray)(转)
查看>>
UIScrollView中的手势
查看>>
递归和迭代的差别
查看>>
基于jquery的可拖动div
查看>>
可以简易设置文字内边距的EdgeInsetsLabel
查看>>
[詹兴致矩阵论习题参考解答]习题1.3
查看>>
Android Fragment的使用
查看>>
沙朗javascript总结一下(一)---基础知识
查看>>
js深入研究之函数内的函数
查看>>