精华转。要点就是要把数据先处理完成,再用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提供了几种不同的分页方式,包括ROWNUM、ROWNUM BETWEEN、ROWNUMBER() OVER()等。其中,ROWNUM是最基础的分页方法,它为每一行返回的结果集分配一个唯一的整数值。但是,ROWNUM在并行查询...
#### 一、Oracle分页原理 Oracle中的分页主要通过`ROWNUM`伪列来实现。`ROWNUM`为每一行分配一个唯一的编号,起始值为1。通过限制`ROWNUM`的范围,可以有效地控制返回结果的数量,从而实现分页效果。 #### 二、...
#### 二、Oracle分页查询基本原理 在Oracle数据库中,实现分页查询主要有两种方式:基于`ROWNUM`和基于`OFFSET`和`FETCH`。在早期版本的Oracle中,通常使用`ROWNUM`来实现分页功能。 #### 三、基于ROWNUM的分页...
下面将详细介绍Oracle分页存储过程的实现原理、步骤及如何在C#中调用。 #### 存储过程设计 存储过程`proc_page`旨在通过动态SQL语句生成和执行来实现分页查询。其参数设计如下: 1. **`p_tablename`**: 表名,...
本文将详细介绍一个特定的Oracle分页查询语句:“`select * from (select a.*,rownum rn from (select * from tablename) a where rownum) where rn>2`”,并对其背后的原理进行深入探讨。 #### 分页查询语句解析 ...
在Oracle数据库中,分页查询是一项...总的来说,通过精心设计的存储过程,我们可以实现高效的多条件Oracle分页查询,同时确保查询性能不受数据量的影响。在实际应用中,应根据具体情况进行调整和优化,以达到最佳效果。
下面将详细讨论Oracle分页查询的原理、方法以及性能分析。 首先,Oracle的分页查询语句通常有以下结构: ```sql SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM ) ...
#### 一、理解Oracle分页查询的基本原理 在Oracle中实现分页查询通常有两种方法:基于ROWNUM的方法和子查询方法。这里主要讨论的是基于ROWNUM的分页查询方式。其基本思想是通过ROWNUM过滤出特定范围内的记录,然后...
首先,我们需要了解JSP分页的基本原理。在JSP中,分页通常通过Servlet或JSP本身处理,涉及的关键步骤包括:计算总页数、获取当前页数据以及构建分页链接。分页插件则可以简化这一过程,提供预定义的函数和模板,帮助...
本篇将深入探讨Oracle数据库分页的实现原理及其在JavaWeb开发中的应用。 首先,我们需要理解分页的基本概念。分页是将一个大的查询结果集分成多个小的部分,每个部分称为一页,用户每次只加载和查看其中一页的数据...
一、Oracle分页查询原理 在Oracle中,实现分页查询通常使用ROWNUM伪列。ROWNUM是在查询结果集生成时自动分配的一个整数值,表示每行在结果集中的位置。通过比较ROWNUM与指定的范围,我们可以获取到特定页的数据。...
1. **分页原理** Oracle分页通常通过`ROWNUM`或`ROWNUMBER()`函数实现。`ROWNUM`是在查询执行时分配的,而`ROW_NUMBER()`是窗口函数,可以在分组和排序后分配。基本的分页查询可以这样写: ```sql SELECT * FROM ...
但了解底层的SQL分页机制有助于理解框架的工作原理,也能在必要时进行优化。 在提供的"demo2"文件中,可能包含了一个已经封装好的Oracle JDBC分页实现,你可以查阅这个示例代码,了解具体的实现方式。该示例可能是...
本篇将深入探讨Oracle分页查询的实现机制、效率差异以及优化技巧。 在Oracle中,分页查询的基本格式通常采用嵌套查询结构,以下是一个典型的示例: ```sql SELECT * FROM ( SELECT A.*, ROWNUM RN FROM ( ...
### Oracle分页实现方法 #### 方法一:使用ROWNUM ROWNUM是Oracle中的一个伪列,它可以为结果集中的每一行分配一个唯一的行号。利用ROWNUM进行分页的基本思想是在内层查询中筛选出所有需要的数据,然后在外层查询...
理解分页的基本原理和Oracle提供的函数,结合实际编程环境,可以有效地实现高效、灵活的分页功能。对于初学者而言,可能需要一定的实践和调试才能完全掌握,但随着经验的增长,你会发现分页查询其实并不复杂。
### Oracle分页查询技术 在Oracle数据库中,实现分页查询是常见的需求之一,尤其是在处理大量数据时。本文将详细介绍如何使用Oracle进行有效的分页查询,并深入探讨其背后的原理及优化策略。 #### 分页查询的基本...