oracle中数据分页详解

今天做项目时要实现分页功能,以前只在mysql上弄过,oracle倒没试过,但知道有这样一个rownum这个东西。

但这个东西也不是那么容易用的,还是有蛮多地方要注意的。它不是物理上存在的一列,而是oracle自己在结果集中进行添加的。

首先我们来看一下我们的表结构先:

我们新建一个表:

  也就一个字段ID而已,这方便我们直接地看到结果。

我们先随便插入几条数据:

先弄进去5条吧。

我们直接来一个:

Sql代码  

  1. select rownum,id from test;  

  我们看到结果:

很高兴吧,都是一模一样的,ronwum和ID是一样的,方便我们看。

 

但结果看到的结果可能就会让你郁闷啦。

 

继续下来,我们删除几条数据再插入几条:

看到结果,我们是删除了后面两条,4,5这两条记录,而插入了8,9这两条记录。我们再来执行查询:

Sql代码  

  1. select rownum,id from test;  

我们看到ID为8,9的已经取代了之前的4,5得到了rownum为4,5。这个说明了什么,说明了rownum并不是物理存在的,如果是物理存在的那么它肯定会随着4,5的删除而把rownum的4,5都删除了,但它并没有,而是把新插入的记录的rownum作为此值,这说明rownum肯定只是一个逻辑上的列,它有一个专门的名称——伪列。

 

下面我们继续插入数据,方便做下面的实验:

 

如果我们需要取得前5条记录,我们会怎么做呢?我们看到前面的rownum是根据我们查出来的结果来进行赋值的,那么我们就明白了,也许可以这样:

Sql代码  

  1. select rownum,id from test where rownum <= 5 order by id;  

  但很杯具的是,我们错了,看看结果:

为什么错呢?

  原因就是rownum会在我们查询出来结果还没排序前就进行编号。由于是这个原因,我们只要加个字查询就OK啦。

Sql代码  

  1. select rownum,id from (select * from test order by id) where rownum <= 5;  

  我们看看结果:

现在没问题了,已经按照rownum来排序了,也就是实现了我们的要求,查出前5个。

 

不要高兴的太早,查前5个没问题,那中间的记录呢,第2到5个呢,或者大于5呢。我们来看看:

Sql代码  

  1. select rownum,id from (select * from test order by id) where rownum >=1 and  rownum <= 4;  

   看看结果:

  这个有数据,而且正常,很好。

但不要高兴,我们分页一般不会只要第一条开始吧,如果要中间呢?我们看看:

Sql代码  

  1. select rownum,id from (select * from test order by id) where rownum >=1 and  rownum <= 4;  

  这次不要大跌眼睛了:

  杯具了吧。

为什么我们刚才拿到的>=1时会有呢,而现在>=2没有呢?

 

原因就是oracle在赋值rownum的时候会从1开始赋值,而当我们进行rownum >=1时,由于=1这个条件是成立的,所以它可以继续取下一条rownum,继续赋值到2,接连赋值下去。

而当我们用rownum >=2时,由于=2这个条件是不成立的,因为当取到第一条rownum=1时,会把它丢弃,而当取到下一条时,rownum还是为1,还是不满足,一直这样的循环,最后的结果就是没数据可查出了。

 

但我们分页确实要这样要进行,怎么办呢?

其实也简单,还是子查询的方式,不是直接用rownum那我们把子查询中的rownum命一个别名然后通过它来限定不就OK了。

我们看看:

Sql代码  

  1. select rn,id from (select rownum as rn,id from (select * from test order by id) ) where rn >=2 and rn <= 4;  

  也许很多朋友看不明白是什么意思,我们先看看结果:

很正常,没问题吧。

但为什么这样就没问题呢?其实我们在上面的子查询中,直接把rownum用rn作为别名,它就被完全记录下来了,这里我们用它来作限定条件已经不关原来的rownum的事了。之所以要用两个子查询是因为第一个排序需要作为子查询才可以取到正确的rownum,才可以定义别名。

相信看到这,大家都应该知道怎么用oracle来实现分页啦

时间: 2024-11-13 06:43:42

oracle中数据分页详解的相关文章

oracle中的dual详解

对于Oracle的dual,有以下几点我们需要明确:   第一点dual不是缩写词而是完整的单词.dual名词意思是对数,做形容词时是指二重的,二元的.   第二点Oracle中的dual表是一个单行单列的虚拟表.   第三点Dual表是oracle与数据字典一起自动创建的一个表,这个表只有1列DUMMY,数据类型为VERCHAR2(1),dual表中只有一个数据'X', Oracle有内部逻辑保证dual表中永远只有一条数据.   第四点Dual表主要用来选择系统变量或求一个表达式的值.  

C#操作Clipboard读取剪切板中数据实例详解

  本文实例讲述了C#操作Clipboard读取剪切板中数据的方法.分享给大家供大家参考.具体分析如下: 1 自定义一个类,并且保证它的可序列化的:实现ISerializable接口;或者用[Serializable]标记(如果有父类,则父类也需要被标记;可以[NonSerialized()]标记类中不想被序列化的字段) 2 注册自定义数据格式:调用静态方法DataFormats.GetFormat() 3 保存数据到clipboard:利用IdataObject接口,创建一个数据对象,并设置数

oracle中tkprof程序详解

现对tkprof程序做进一步的说明: 在打开跟踪功能后,oracle将被跟踪session中正在执行的SQL的性能状态数据都收集到一个跟踪文件中.这个跟踪文件提供了许多有用的信息,例如一个sql的解析次数.执行次数.fetch次数.物理读次数.逻辑读次数.CPU使用时间等,利用这些信息可以诊断你的sql的问题,从而用来优化你的系统.不幸的是,生成的跟踪文件中的数据是我们难以理解的,所以要用TKPROF工具对其进行转换,转换成我们易于理解格式.tkprof是oracle提供的实用工具,类似于sql

oracle中的视图详解_oracle

1.视图的概述 视图其实就是一条查询sql语句,用于显示一个或多个表或其他视图中的相关数据.视图将一个查询的结果作为一个表来使用,因此视图可以被看作是存储的查询或一个虚拟表.视图来源于表,所有对视图数据的修改最终都会被反映到视图的基表中,这些修改必须服从基表的完整性约束,并同样会触发定义在基表上的触发器.(Oracle支持在视图上显式的定义触发器和定义一些逻辑约束) 2.视图的存储 与表不同,视图不会要求分配存储空间,视图中也不会包含实际的数据.视图只是定义了一个查询,视图中的数据是从基表中获取

javascript中数据类型转换详解

在js中,数据类型转换分为显式数据类型转换和隐式数据类型转换. 1, 显式数据类型转换 a:转数字: 1)Number转换: 代码: vara = "123";   a = Number(a); 注意: a) 如果转换的内容本身就是一个数值类型的字符串,那么将来在转换的时候会返回自己. b) 如果转换的内容本身不是一个数值类型的字符串,那么在转换的时候结果是NaN. c) 如果要转换的内容是空的字符串,那以转换的结果是0. d) 如果是其它的字符,那么将来在转换的时候结果是NaN. 2

vs.net beta 2中利用DataGrid分页详解

datagrid|分页|详解 beta 2中利用DataGrid分页说明:1.本篇文章只适用于初学vs.net者,尤其对vs.net环境还不是很熟悉者.2.需要的环境:win2000, sql server2000, vs.net beta2步骤:1. 打开 VS.NET Beta 2:2. 建立一个 C# ASP.NET Web 应用程序 工程:3.从工具箱->数据 页拖动SqlDataAdapter 到Web Form设计窗口:技巧:CTRL-ALT-X  可以快速切换到工具箱界面:4.这时

【体系结构】Oracle数据块详解

Oracle数据块详解 操作系统块是操作系统读写的最小操作单元,也是操作系统文件的属性之一.当创建一个Oracle数据库时,选择一个基于操作系统块的整数倍大小作为Oracle数据库块的大小.Oracle数据库读写操作则是以Oracle块为最小单位,而非操作系统块. 数据库块也称逻辑块或Oracle块,它对应磁盘上一个或多个物理块,它的大小由初始化参数DB_BLOCK_SIZE决定,可以定义数据块为2K.4K.8K.16K.32K甚至更大,默认Oracle块大小是8K.若一旦设置了Oracle数据

SPL3.0数据连接详解

数据|详解 SPL3.0数据连接详解 SPL3.0数据支持能力 SPL3.0在数据连接方面作了很大的改进,使用多种方式对多种数据库进行连接访问,让用户有了更多的选择, 支持的数据库有:SQL Server .Access.Oracle.其他ODBC连接 支持的连接方式有: 用System.Data.SqlClient访问SQL Server 用System.Data.OleDb访问Access和Oracle 用System.Data.Odbc访问SQL Server.Oracle等其他ODBC连

oracle闪回表详解

  --- 说明闪回数据库 --- 使用闪回表将表内容还原到过去的特定时间点 --- 从删除表中进行恢复 --- 使用闪回查询查看截止到任一时间点的数据库内容 --- 使用闪回版本查询查看某一行在一段时间内的各个版本 --- 使用闪回事务查询查看事务处理历史记录或行 优点: 闪回技术由于只能处理更改数据,所以从根本上改变了恢复技术.使用这个技术时,从错误中恢复花费的时间等于制造错误所花费的时间.当闪回技术使用时,它与介质恢复相比,在易用性.可用性和还原时间方面有明显的优势. 闪回数据库使用闪回日