oracle rownum用法_oracle的rownum「建议收藏」

oracle rownum用法_oracle的rownum「建议收藏」rownum是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列(强调:先要有结果集)。简单的说rownum是对符合条件结果的序列号。它总是从1开始排起的。rownum和rowid都是伪列,但是两者的根本是不同的,rownum是根据sql查询出的结果给每行分配一个逻辑编号,所以你的sql不同也就会导致最终rownum不同,但是rowid是物理结构上的,在每条记录insert到数据库中时…_oraclerownum函数

oracle rownum用法_oracle的rownum「建议收藏」

rownum是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。简单的说rownum是对符合条件结果的序列号。它总是从1开始排起的。

rownum和rowid都是伪列,但是两者的根本是不同的,rownum是根据sql查询出的结果给每行分配一个逻辑编号,所以你的sql不同也就会导致最终rownum不同,但是rowid是物理结构上的,在每条记录insert到数据库中时,都会有一个唯一的物理记录。

用法:

1、查询第几行的记录

    select sal from emp where rownum=1; //查询得到第一行记录

    select sal from emp where rownum=5; //不可以查询到第五行记录,因为rownum 总是从1开始查询的,故这种方式不可以直接得到第几行的记录。若想得到第五行记录,应采用如下方式:

    select r,sal from (select rownum r,sal from emp) where r= 5;

2、用来获取前几行的记录,即小于某值的记录。

例:查询前四行的记录

     select rownum,sal from emp where rownum<5;

3、用来获取后几行的记录,即大于某值的记录。例:查询第五行之后的记录

      select r,sal from (select rownum r,sal from emp ) where r>5;

4、查询一个范围内的记录。如查询第三行到底八行的记录:

      select r,sal from (select rownum r,sal from emp) where r>=3 and r<=8;

5、rownum 与排序

      select rownum,sal from emp order by sal;

从这条语句的运行结果你可以发现,rownum不是从1 依次增大,而是乱的,实际上这些rownum是指每条记录未排序之前所处的行数,当然这不是我们想要的结果,那么如何得到rownum也是顺序排列的查询结果呢?这就需要先对原纪录排序,然后从新的顺序中提取出rownum和想要的记录内容。如:

      select rownum,sal from (select * from emp order by sal) ;

      select rownum, sal from (select * from emp order by sal ) where rownum <5;

      select r, sal from (select rownum r,sal from (select * from emp order by sal )) where r >5;

      select r, sal from (select rownum r,sal from (select * from emp order by sal )) where r >5 and r < 10;

 

oracle中的rownum、order by与分页

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

语句一: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
         8       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;

 

今天的文章oracle rownum用法_oracle的rownum「建议收藏」分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/58357.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注