rownum浅谈(一)
只要做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浅谈(一)的更多相关文章
- rownum浅谈(二)
上篇说到rownum和order by及索引列的关系,明白了通过构建一个子查询把查询结果固定住再取数就可以了 .还是取最近10条创建的用户: select * from (select u.* fro ...
- 【ASP.NET MVC系列】浅谈jqGrid 在ASP.NET MVC中增删改查
ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...
- 【ASP.NET MVC系列】浅谈ASP.NET MVC 视图与控制器传递数据
ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...
- 浅谈 Fragment 生命周期
版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...
- 浅谈 LayoutInflater
浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...
- 浅谈Java的throw与throws
转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...
- 浅谈SQL注入风险 - 一个Login拿下Server
前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...
- 浅谈WebService的版本兼容性设计
在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...
- 浅谈angular2+ionic2
浅谈angular2+ionic2 前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别. 1. 项目所用:angular2+ionic2 ...
随机推荐
- 2017.10.25 Java List /ArrayList 三种遍历方法
java list三种遍历方法性能比较 学习java语言list遍历的三种方法,顺便测试各种遍历方法的性能,测试方法为在ArrayList中插入记录,然后遍历ArrayList,测试代码如下: pac ...
- c++参数传递的三种方式
一般来说C++中参数传递有三种方式:值传递.指针传递.引用传递 1.值传递——传值 值传递是最常见的一种参数传递的方式,但是对初学者来说也最容易出错.如下例: #include<iostream ...
- test image
Most of these images are in PBM or PGM format and compressed with GNU Zip and GNU TAR Note: These pa ...
- redux详解
redux介绍 学习文档:英文文档,中文文档,Github redux是什么 redux是一个独立专门用于做状态管理的JS库(不是react插件库),它可以用在react, angular, vue等 ...
- OpenMP常用函数
1.设置线程数目 定义如下: void omp_set_num_threads(int num_threads); 通过该函数来指定其后用于并行计算的线程数目,其中参数num_threads就是指定的 ...
- Python2.x 和 3.x 的区别
Python有两个版本,2.x 和 3.x ,两个版本不兼容,3.x 不不考虑对2.x代码的向后兼容. 在3.x中,一些语法,内建函数和对象的行为都有所调整. 大部分的python库都支持 pytho ...
- javascript入门笔记5-事件
1.继续循环continue; continue的作用是仅仅跳过本次循环,而整个循环体继续执行. 语句结构: for(初始条件;判断条件;循环后条件值更新) { if(特殊情况) { continue ...
- json对象与字符串相互转换
JSON 语法 JSON 语法规则 在 JS 语言中,一切都是对象.因此,任何支持的类型都可以通过 JSON 来表示,例如字符串.数字.对象.数组等.但是对象和数组是比较特殊且常用的两种类型: 对象表 ...
- Docker自学纪实(四)搭建LNMP部署wordpress
我们在工作中最常用的就是LNMP网站平台 这个架构呢,是整个公司网站的核心 如果对于访问量较小的网站,可以直接在服务器上面部署 而如果是访问量很大的网站,那负载就是个很大的问题. 要么需要再买很多服务 ...
- 利用python进行坐标提取以及筛选(文件操作的小应用)
由于目前暂时还未学习到python关于数据处理的模块方面的知识,且刚好最近朋友发来一份坐标数据文件(txt格式),让我帮他对其进行筛选, 因此利用了最近刚学过的python文件处理操作以及以前所学的基 ...