ITPub博客

首页 > 数据库 > Oracle > 【转载】oracle中的rownum、order by与分页

【转载】oracle中的rownum、order by与分页

Oracle 作者:735357659 时间:2013-12-09 21:17:54 0 删除 编辑


先看以下两条语句的履行成绩:

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

    ROWNUM      EMPNO        SAL
---------- ---------- ----------
              7369        800
              7499       1600
              7521       1250
              7566       2975
              7654       1250
              7698       2850
              7782       2450
              7788       3000

  ……

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

    ROWNUM      EMPNO        SAL
---------- ---------- ----------
              7369        800
        12       7900        950
        11       7876       1100
              7521       1250
              7654       1250
        14       7934       1300
        10       7844       1500
              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
---------- ---------- ----------
              7369        800
              7900        950
              7876       1100
              7521       1250
              7654       1250
              7934       1300
              7844       1500
              7499       1600

       ……

阿谁成绩借满足吧。。。

 

分页:在概况再加上一层查询。

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;

 

 

 

 


<!-- 正文结束 -->

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23383680/viewspace-1115723/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2010-02-22