`
liu_lm_lm
  • 浏览: 10749 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

oracle分页原理

阅读更多
精华转。要点就是要把数据先处理完成,再用rownum来处理。

程序里常常会遇到分页的问题,因为用hibernate,所以一直就是用setMaxResult(),setFirstResult()之类的来搞定,可万一不让用hibernate怎么办?直接用SQL怎么搞定呢?

解析oracle的rownum
对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,而且rownum不能以任何表的名称作为前缀。
举例说明:
例如表:student(学生)表,表结构为:

sql 代码
ID       char(6)      --学号   
name    VARCHAR2(10)   --姓名    
create table student (ID char(6), name VARCHAR2(100));   
insert into sale values('200001',‘张一’);   
insert into sale values('200002',‘王二’);   
insert into sale values('200003',‘李三’);   
insert into sale values('200004',‘赵四’);   
commit;   

(1) rownum 对于等于某值的查询条件
如果希望找到学生表中第一条学生的信息,可以使用rownum=1作为条件。但是想找到学生表中第二条学生的信息,使用rownum=2结果查不到数据。因为rownum都是从1开始,但是1以上的自然数在rownum做等于判断是时认为都是false条件,所以无法查到rownum = n(n>1的自然数)。

sql 代码
SQL> select rownum,id,name from student where rownum=1;(可以用在限制返回记录条数的地方,保证不出错,如:隐式游标)   
SQL> select rownum,id,name from student where rownum=1;   
     ROWNUM ID     NAME  
---------- ------ ---------------------------------------------------   
          1 200001 张一   
SQL> select rownum,id,name from student where rownum =2;    
     ROWNUM ID     NAME  
---------- ------ ---------------------------------------------------   

(2)rownum对于大于某值的查询条件
如果想找到从第二行记录以后的记录,当使用rownum>2是查不出记录的,原因是由于rownum是一个总是从1开始的伪列,Oracle 认为rownum> n(n>1的自然数)这种条件依旧不成立,所以查不到记录

sql 代码
SQL> select rownum,id,name from student where rownum >2;   
ROWNUM ID     NAME  
---------- ------ ---------------------------------------------------   

那如何才能找到第二行以后的记录呀。可以使用以下的子查询方法来解决。注意子查询中的rownum必须要有别名,否则还是不会查出记录来,这是因为rownum不是某个表的列,如果不起别名的话,无法知道rownum是子查询的列还是主查询的列。

sql 代码
SQL>select * from(select rownum no ,id,name from student) where no>2;   
        NO ID     NAME  
---------- ------ ---------------------------------------------------   
          3 200003 李三   
          4 200004 赵四   
SQL> select * from(select rownum,id,name from student)where rownum>2;   
     ROWNUM ID     NAME  
---------- ------ ---------------------------------------------------   

(3)rownum对于小于某值的查询条件
如果想找到第三条记录以前的记录,当使用rownum<3是能得到两条记录的。显然rownum对于rownum<n((n>1的自然数)的条件认为是成立的,所以可以找到记录。

sql 代码
SQL> select rownum,id,name from student where rownum <3;   
     ROWNUM ID     NAME  
---------- ------ ---------------------------------------------------   
         1 200001 张一   
         2 200002 王二   

综上几种情况,可能有时候需要查询rownum在某区间的数据,那怎么办呀从上可以看出rownum对小于某值的查询条件是人为true的,rownum对于大于某值的查询条件直接认为是false的,但是可以间接的让它转为认为是true的。那就必须使用子查询。例如要查询rownum在第二行到第三行之间的数据,包括第二行和第三行数据,那么我们只能写以下语句,先让它返回小于等于三的记录行,然后在主查询中判断新的rownum的别名列大于等于二的记录行。但是这样的操作会在大数据集中影响速度。

sql 代码
SQL> select * from (select rownum no,id,name from student where rownum<=3 ) where no >=2;   
        NO ID     NAME  
---------- ------ ---------------------------------------------------   
          2 200002 王二   
          3 200003 李三   

(4)rownum和排序
Oracle中的rownum的是在取数据的时候产生的序号,所以想对指定排序的数据去指定的rowmun行数据就必须注意了。

sql 代码
SQL> select rownum ,id,name from student order by name;   
     ROWNUM ID     NAME  
---------- ------ ---------------------------------------------------   
          3 200003 李三   
          2 200002 王二   
          1 200001 张一   
          4 200004 赵四   

可以看出,rownum并不是按照name列来生成的序号。系统是按照记录插入时的顺序给记录排的号,rowid也是顺序分配的。为了解决这个问题,必须使用子查询

sql 代码
SQL> select rownum ,id,name from (select * from student order by name);   
     ROWNUM ID     NAME  
---------- ------ ---------------------------------------------------   
          1 200003 李三   
          2 200002 王二   
          3 200001 张一   
          4 200004 赵四   

这样就成了按name排序,并且用rownum标出正确序号(有小到大)

一个例子
取出100-150条记录,

sql 代码
select tname,tabtype from (   
   select tname,tabtype,rownum rn from tab where rownum <= 150   
)   
where rn >= 100;   

如果按某一列排序的话,好像就又复杂一些。

sql 代码
select tname,tabtype from (select tname,tabtype,rownum rn from(select * from tab order by tname)where rownum <=150) where rn>=100;   

要点就是要把数据先处理完成,再用rownum来处理。
分享到:
评论

相关推荐

    Oracle分页

    一、Oracle分页原理 Oracle提供了几种不同的分页方式,包括ROWNUM、ROWNUM BETWEEN、ROWNUMBER() OVER()等。其中,ROWNUM是最基础的分页方法,它为每一行返回的结果集分配一个唯一的整数值。但是,ROWNUM在并行查询...

    Oracle分页详解

    #### 一、Oracle分页原理 Oracle中的分页主要通过`ROWNUM`伪列来实现。`ROWNUM`为每一行分配一个唯一的编号,起始值为1。通过限制`ROWNUM`的范围,可以有效地控制返回结果的数量,从而实现分页效果。 #### 二、...

    oracle分页查询sql

    #### 二、Oracle分页查询基本原理 在Oracle数据库中,实现分页查询主要有两种方式:基于`ROWNUM`和基于`OFFSET`和`FETCH`。在早期版本的Oracle中,通常使用`ROWNUM`来实现分页功能。 #### 三、基于ROWNUM的分页...

    Oracle分页存储过程

    下面将详细介绍Oracle分页存储过程的实现原理、步骤及如何在C#中调用。 #### 存储过程设计 存储过程`proc_page`旨在通过动态SQL语句生成和执行来实现分页查询。其参数设计如下: 1. **`p_tablename`**: 表名,...

    oracle 分页语句

    本文将详细介绍一个特定的Oracle分页查询语句:“`select * from (select a.*,rownum rn from (select * from tablename) a where rownum) where rn&gt;2`”,并对其背后的原理进行深入探讨。 #### 分页查询语句解析 ...

    Oracle 分页存储过程

    在Oracle数据库中,分页查询是一项...总的来说,通过精心设计的存储过程,我们可以实现高效的多条件Oracle分页查询,同时确保查询性能不受数据量的影响。在实际应用中,应根据具体情况进行调整和优化,以达到最佳效果。

    oracle分页查询

    下面将详细讨论Oracle分页查询的原理、方法以及性能分析。 首先,Oracle的分页查询语句通常有以下结构: ```sql SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM ) ...

    解决Oracle分页查询中排序与效率问题

    #### 一、理解Oracle分页查询的基本原理 在Oracle中实现分页查询通常有两种方法:基于ROWNUM的方法和子查询方法。这里主要讨论的是基于ROWNUM的分页查询方式。其基本思想是通过ROWNUM过滤出特定范围内的记录,然后...

    jsp分页 oracle 插件demo

    首先,我们需要了解JSP分页的基本原理。在JSP中,分页通常通过Servlet或JSP本身处理,涉及的关键步骤包括:计算总页数、获取当前页数据以及构建分页链接。分页插件则可以简化这一过程,提供预定义的函数和模板,帮助...

    oracle分页源码

    本篇将深入探讨Oracle数据库分页的实现原理及其在JavaWeb开发中的应用。 首先,我们需要理解分页的基本概念。分页是将一个大的查询结果集分成多个小的部分,每个部分称为一页,用户每次只加载和查看其中一页的数据...

    oracle分页存储过程

    一、Oracle分页查询原理 在Oracle中,实现分页查询通常使用ROWNUM伪列。ROWNUM是在查询结果集生成时自动分配的一个整数值,表示每行在结果集中的位置。通过比较ROWNUM与指定的范围,我们可以获取到特定页的数据。...

    oracle分页

    1. **分页原理** Oracle分页通常通过`ROWNUM`或`ROWNUMBER()`函数实现。`ROWNUM`是在查询执行时分配的,而`ROW_NUMBER()`是窗口函数,可以在分组和排序后分配。基本的分页查询可以这样写: ```sql SELECT * FROM ...

    oracle-jdbc分页实现(只需传入sql语句即可实现分页)

    但了解底层的SQL分页机制有助于理解框架的工作原理,也能在必要时进行优化。 在提供的"demo2"文件中,可能包含了一个已经封装好的Oracle JDBC分页实现,你可以查阅这个示例代码,了解具体的实现方式。该示例可能是...

    oracle 分页的部分

    本篇将深入探讨Oracle分页查询的实现机制、效率差异以及优化技巧。 在Oracle中,分页查询的基本格式通常采用嵌套查询结构,以下是一个典型的示例: ```sql SELECT * FROM ( SELECT A.*, ROWNUM RN FROM ( ...

    Oracle分页实现

    ### Oracle分页实现方法 #### 方法一:使用ROWNUM ROWNUM是Oracle中的一个伪列,它可以为结果集中的每一行分配一个唯一的行号。利用ROWNUM进行分页的基本思想是在内层查询中筛选出所有需要的数据,然后在外层查询...

    分页代码Oracle

    理解分页的基本原理和Oracle提供的函数,结合实际编程环境,可以有效地实现高效、灵活的分页功能。对于初学者而言,可能需要一定的实践和调试才能完全掌握,但随着经验的增长,你会发现分页查询其实并不复杂。

    Oracle分页查询技术

    ### Oracle分页查询技术 在Oracle数据库中,实现分页查询是常见的需求之一,尤其是在处理大量数据时。本文将详细介绍如何使用Oracle进行有效的分页查询,并深入探讨其背后的原理及优化策略。 #### 分页查询的基本...

Global site tag (gtag.js) - Google Analytics