ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle的rownum

Oracle的rownum

原创 Linux操作系统 作者:jhondom 时间:2013-04-23 14:09:43 0 删除 编辑

Oracle的rownum是数据库中的一个伪列,它是依据查询的过程而临时产生的,并不是已在数据库中存在的数据列。是oracle数据库从数据文件或数据缓冲区中读取数据的顺序。在查询语句的执行中,数据库先查询出结果集,再根据结果集形成对应的rownum,而且rownum始终是动态的从1开始进行记录的。rownum不能以任何基表为前缀。对于oracle数据库只能使用符号(<,<=,!=)而不能使用(>,>=,=,between..and)举例说明:

SQL> select rownum,t.* from t where rownum<10;

    ROWNUM         ID NAME
---------- ---------- ------------------------------
         1          1 a
         2          2 a
         3          3 a
         4          4 a
         5          5 a
         6          6 a
         7          7 a
         8          8 a
         9          9 a

9 rows selected.

查询的结果与实际一致。

SQL> select rownum,t.* from t where rownum>20;

no rows selected。

查询的结果出乎意料。对照上述概念可以理解为rownum是在查到结果集后再加上去的列,是对符合条件结果的序列号,总是从1开始排起得。所以选出的结果不可能没有1,而又其他大于1的值。对于上述rownum>20没有记录,因为第一条不满足的话,第二条的rownum又变成了1,所以永远没有满足的记录。

看几种具体的情况:

1.SQL> select rownum,t.* from t where rownum!=10;

    ROWNUM         ID NAME
---------- ---------- ------------------------------
         1          1 a
         2          2 a
         3          3 a
         4          4 a
         5          5 a
         6          6 a
         7          7 a
         8          8 a
         9          9 a

9 rows selected.

与select rownum,t.* from t where rownum<10返回的结果集一样,因为是在查询到结果集后,显示完第9条记录后,之后的记录也都是!=10或者>=10,所以只显示前面9条,也可以理解为rownum为9后的记录的rownum为10,因为条件为!=10,所以去掉,其后记录补上,rownum又是10,也去掉,如果下去也就只会显示前面9条记录了。

2.SQL> select rownum,t.* from t where rownum>1;

no rows selected。

而select rownum,t.* from t where rownum>0或select rownum,t.* from t where rownum>=1总是显示所有记录。因为rownum是在查询到结果集后加是去的,总是从1开始的。

3.SQL> select rownum,t.* from t where rownum between 1 and 10;

    ROWNUM         ID NAME
---------- ---------- ------------------------------
         1          1 a
         2          2 a
         3          3 a
         4          4 a
         5          5 a
         6          6 a
         7          7 a
         8          8 a
         9          9 a
        10         10 a

10 rows selected.

而SQL> select rownum,t.* from t where rownum between 2 and 10无结果集返回来,因为rownum是在查询到结果集后加上去的,总是从1开始的。在任何时候rownum都是从1开始的,它在结果集中不可或缺,少了它结果集就不存在。所以在查询的时候rownum条件要包含1.

但如果就要查询rownum>10这种条件的结果集的话,可以使用oracle的嵌套语句把rownum先生成后再进行查询,如:

SQL> select * from (select rownum as rn,t.* from t where rownum<30) where rn>10;

        RN         ID NAME
---------- ---------- ------------------------------
        11         11 a
        12         12 a
        13         13 a
        14         14 a
        15         15 a
        16         16 a
        17         17 a
        18         18 a
        19         19 a
        20         20 a
        21         21 a

        RN         ID NAME
---------- ---------- ------------------------------
        22         22 a
        23         23 a
        24         24 a
        25         25 a
        26         26 a
        27         27 a
        28         28 a
        29         29 a

19 rows selected.

oracle也是使用上述嵌套语句进行数据分页查询的。

oracle中还有rowid与rownum一样都成为伪列,它们的区别是rowid是物理存在的,标记一条数据记录在表空间中唯一的位置ID,在数据库中唯一,只要数据未移动,rowid是不变的,相对表来说像表中的一列。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

上一篇: Oracle的Rowid
下一篇: Runstats
请登录后发表评论 登录
全部评论

注册时间:2013-04-21

  • 博文量
    15
  • 访问量
    28489