`

oracle rownum Pseudocolumn

    博客分类:
  • db
阅读更多
(今天仔细查看了下 oracle rownum 的文档,整理了一下,当做笔记;)


ROWNUM Pseudocolumn

在查询结果中,ROWNUM 用于唯一标识查询结果记录,

------
rownum 的赋值

rownum 的赋值时间点在 记录查处之后,且在排序之前,
查询结果中每条记录的 ROWNUM 是唯一的,在记录查出后,rownum值 第条记录是 1,第2条是 2,依次类推,
如果查询语句使用了 order by 语句,那么 rownum 在赋值后,记录再按照 order by 语句排序,则最后查出的结果的顺序 跟 rownum 的排序 可能是不一致的,

在带有 order by 语句的查询中,如果希望最后查出记录的顺序 和 rownum 一致,则需要先排序查询,再从查询结果进行查询,即多了一层查询;

------
rownum 的使用

可以根据 rownum 限制查询记录数 或 分页,需要遵循 rownum 的规则,

rownum 的比较规则:
* <
        小于比较,按大小比较,等同于小学算术比较;
* =
        等于比较,只能和 1 进行等于比较,大于1的任何行都返回 false,
        因此只能使用 rownum = 1,对于 rownum = 2 是不返回任何记录的;
* >
        大于比较,只能大于 0 ,也就等同于没有限制,
        当和大于0的值进行比较时,都返回 false,不会查处任何记录;

* <=
        小于等于,相当于 < 和 = 的并集,等同于小学算术比较;
* >=
        大于等于,相当于 > 和 = 的并集,只能和 0,1 比较,即 >=0 或 >=1,相当于没有限制,这个是没有意义的;


------
> 和 = 比较操作:

如果希望像算数运算一样使用 > 和 = ,则需要先在查询中将 rownum 查出来,组成新的记录集,在新的记录集中存的 rownum 就变成了可以进行各种算数比较的数值,
再用1个外层查询从这个记录集中进行查询,这样外层查询就可以使用内层查出的 rownum 值进行各种比较了;

------
分页

分页查询总需要对 rownum 进行 > 和 < 比较操作,但是 rownum 本身的 > 比较 不支持大于1的比较,
因此需要先将 rownum 查出来,然后再外层查询对已查出的 rownum 值进行各种算数比较;

------
例子:
查询 abc 表的所有字段,每页10条,分别查: “不排序第1页”,“排序第1页”,“不排序第2页”,“排序第2页”

        -- 不排序,前10条
        select * from abc where rownum <=10;
        
        -- 排序,前10条
        select * from
          (select * from abc order by id desc) abc_order
        where rownum <=10;

        -- 不排序,11 - 20 条        
        select * from
          (select abc.*, rownum as row_num from abc where rownum <=20) abc_order
        where row_num >= 11;

        -- 排序,11 - 20 条        
        select * from 
          (
            select abc_order.*, rownum as row_num 
            from 
              (select * from abc order by id desc) abc_order
            where rownum <= 20
          ) 
        where row_num >=11;

------
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics