只要做web开发,几乎没有不需要分页查询的,在oracle中,rownum就是用来进行处理分页的。

1.rownum是oracle对结果集返回的一个伪列,也就是说是先查询完结果之后再加上的一个虚列,相当于对符合条件的结果的一个序列号。如果有结果的话,rownum伪列产生的序号是按

照数据被查询出来的顺序添加上去的, rownum总是从1开始,依次加1。

select rownum,u.* from t_user u

可以看到,rownum按序显示了。我们需要查找前10条数据

select rownum,u.* from t_user u where rownum <= 10

数据正常查找出来,没有问题。如果我们查询结果中有排序呢,看看结果如何

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浅谈(一)的更多相关文章

  1. rownum浅谈(二)

    上篇说到rownum和order by及索引列的关系,明白了通过构建一个子查询把查询结果固定住再取数就可以了 .还是取最近10条创建的用户: select * from (select u.* fro ...

  2. 【ASP.NET MVC系列】浅谈jqGrid 在ASP.NET MVC中增删改查

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

  3. 【ASP.NET MVC系列】浅谈ASP.NET MVC 视图与控制器传递数据

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

  4. 浅谈 Fragment 生命周期

    版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...

  5. 浅谈 LayoutInflater

    浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...

  6. 浅谈Java的throw与throws

    转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...

  7. 浅谈SQL注入风险 - 一个Login拿下Server

    前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...

  8. 浅谈WebService的版本兼容性设计

    在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...

  9. 浅谈angular2+ionic2

    浅谈angular2+ionic2   前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别.   1. 项目所用:angular2+ionic2 ...

随机推荐

  1. python_2_变量的使用2

    ''' 多行注释(三个单引号,或者双引号) gf_of_oldboy="Chen rong hua"#变量的表示办法1,用下划线(老男孩的女朋友) GfOfOldboy=" ...

  2. Mybatis之批量更新操作

    更新单条记录 UPDATE course SET name = 'course1' WHERE id = 'id1'; 更新多条记录的同一个字段为同一个值 UPDATE course SET name ...

  3. java设计模式——桥接模式

    一. 定义与类型 定义:将抽象部分与他的具体实现部分分离,使它们都可以独立的变化,通过组合的方式建立两个类之间的联系,而不是继承 类型:结构性. 二. 使用场景 (1) 抽象和具体实现之间增加更多的灵 ...

  4. 最近的阅读list

    fast rcnn 统一了sppnet和rcnn,将原来rcnn分stage的训练合为一个整体的stage,一次完成cls, regression的训练.引入两个loss函数,一个是用来进行cls的, ...

  5. 《JavaScript高级程序设计第三版》——细碎知识痛点整理(第六章)

    面向对象的程序设计 对象是一组没有特定顺序的值6.1.1 属性类型ECMAScript中有两种属性:数据属性和访问器属性.1. 数据属性Configurable 表示能否通过delete删除属性从而重 ...

  6. io与Nio的区别及实用场景

    https://blog.csdn.net/wodeyuer125/article/details/39475207

  7. js、jquery初始化加载顺序

    // ready 这个方法只是在页面所有的DOM加载完毕后就会触发 // 方式1 $(function(){ // do something }); // 方式2 $(document).ready( ...

  8. Eclipse中文乱码解决方案

    Eclipse中文乱码解决方案 1)第一个设置:window>perferences>general>workspace>text file encoding 2)Jsp编码问 ...

  9. PHP成随机字符串

    生成随机字符串 /** * 随机字符串 * @param int $len * @return string */ function randomStr($len = 32) { $chars = & ...

  10. 易语言制作的QQ聊天中常用的GIF图片【带源码下载】

    该软件调用网页实现表情包制作,使用了精益模块. 最近比较火的王境泽.张学友.切格瓦拉.为所欲为.今天星期五.黑人问号脸.偷电瓶车.诸葛孔明.金坷垃等都可以通过此软件在线制作属于你的表情包. 太困了懒得 ...