美文网首页
rownum浅谈(一)

rownum浅谈(一)

作者: 一二三言 | 来源:发表于2017-05-10 09:32 被阅读20次
只要做web开发,几乎没有不需要分页查询的,在oracle中,rownum就是用来进行处理分页的。

rownum是oracle对结果集返回的一个伪列,也就是说是先查询完结果之后再加上的一个虚列,相当于对符合条件的结果的一个序列号。如果有结果的话,rownum伪列产生的序号是按照数据被查询出来的顺序添加上去的, rownum总是从1开始,依次加1,先看个例子。

select rownum,u.* from t_user u

图1

可以看到,rownum依次显示了。我们需要查找前10条数据
select rownum,u.* from t_user u where rownum <= 10

图2

数据正常查找出来,没有问题。如果我们查询结果中有排序呢,看看结果如何
select rownum,u.* from t_user u where rownum <= 10 order by u.c_id desc;

select rownum,u.* from t_user u order by u.c_id desc;

第一条语句执行结果 第二条语句执行结果

可以看到数据没有问题,换成下面的语句
select rownum,u.* from t_user u where rownum <= 10 order by u.c_createdate desc;

select rownum,u.* from t_user u order by u.c_createdate desc;

第一条语句执行结果 第二条语句执行结果

可以看到,按照创建时间排序查询前10条有问题了,但是看第二条执行结果,创建时间最近的应该是chenz.ccsd而不是第一条中的43573830。为什么会这样呢?

这是因为ORACLE内部的查询优化器和索引搞的鬼。

当一条语句交给查询优化器处理时,会有两种情况:

一种如果排序列上有索引的话,则借助索引去查询数据,这样读取出来的数据是有序的,然后为排序后的数据从第一行到最后一行赋予rownum值;

另一种排序列上没有没有索引的话,则会先进行全表扫描依次读取数据,然后为数据赋予rownum值,再进行排序,此时所选取的数据就不是进行排序的了。

上面语句中c_id是有索引的,而c_createdate是没有建立索引的。
由于排序列上不一定要有索引,所以在使用rownum分页时,需要多加一层查询,以保证rownum的连续性。

相关文章

  • rownum浅谈(一)

    rownum是oracle对结果集返回的一个伪列,也就是说是先查询完结果之后再加上的一个虚列,相当于对符合条件的结...

  • rownum浅谈(二)

    上篇说到rownum和order by及索引列的关系,明白了通过构建一个子查询把查询结果固定住再取数就可以了 。还...

  • Mysql查询显示行号

    select shoppingmall_classify.*, @rownum:=@rownum+1 rownum...

  • oracle rownum rowid使用场景

    rownum rowid rownum 分页

  • 数组排序

    letarr=[{ rowNum:1, columNum:1 },{ rowNum:2, columNum:3 }...

  • Oracle数据库的伪列rownum的使用方法

    本文内容及示例代码参考《 Oracle中ROWNUM的使用技巧。》 1.伪列rownum ROWNUM是一种伪列,...

  • 数据伪列

    一、行号:rownum(核心)基本语法:select*from(select 列1,列2 ... rownum r...

  • rownum

    rownum是一个虚列 它并不是一个实际存在的列 只有当查询结果输出之后才会有这么一列 并且值+1递增 rownu...

  • Oracle(RowNum和RowId)

    初识钟情,终于白首;眉眼如故,岁月如故 RowNum和RowId只有在Oracle数据库中才有。 RowNum: ...

  • Oracle之rownum(转载)

    一、rownum的说明 rownum是oracle特有的一个关键字。 (1)对于基表,在insert记录时,ora...

网友评论

      本文标题:rownum浅谈(一)

      本文链接:https://www.haomeiwen.com/subject/wspwtxtx.html