Oracle分页

先看以下两条语句的执行结果:

语句一:select rownum,empno,sal from emp order by empno;

ROWNUM      EMPNO        SAL
  ---------- ---------- ----------

1       7369         800

2       7499       1600

3       7521       1250

4       7566       2975

5       7654       1250

6       7698       2850

7       7782       2450

8       7788       3000

语句二:select rownum,empno,sal from emp order by sal;

ROWNUM      EMPNO        SAL

---------- ---------- ----------

1       7369        800

12       7900        950

11       7876       1100

3       7521       1250

5       7654       1250

14       7934       1300

10       7844       1500

2       7499       1600

同样的两个语句,执行结果中的rownum伪列的值却大相径庭,这是什么原因呢?其实这都是ORACLE内部的查询优化器和索引搞的鬼!

      rownum伪列产生的序号是按照数据被查询出来的顺序添加上去的,第一条是1,第二条是2,依次加1。

当将一条语句交给查询优化器处理时:

如果排序列上有索引,则借助索引去查询数据,这样,读取出来的数据和rownum产生的序号是一种正常的对应关系,如语句一的结果(empno上有主键索引)。

如果排序列上没有索引,则使用全表扫描的方式,依次从表中读取数据,读取完成后,最后进行排序,于是产生了类似语句二的结果(sal列上没有索引)。

正是由于排序列上不一定有索引,所以在ORACLE中使用rownum伪列分页时,需要多加一层查询,以保证rownum序号的连续性。

语句三:select rownum,t.* from (select empno,sal from emp order by sal) t;

ROWNUM      EMPNO        SAL

---------- ---------- ----------

1               7369        800

2               7900        950

3                7876       1100

4                7521      1250

5                7654      1250

6                 7934      1300

7                  7844      1500

这个结果还满意吧。。。

分页:在外面再加上一层查询。

select * from (select rownum num,t.* from (select empno,sal from emp order by sal) t) where num between 6 and 10;

当然,如果使用分析函数row_number就可以省略一层查询了,代码更简单点:

select * from (select row_number() over (order by sal) num,empno,sal from emp) where num between 6 and 10;

时间: 2024-12-18 04:02:38

Oracle分页的相关文章

oracle分页存储过程

oracle分页存储过程: CREATE OR REPLACE PROCEDURE FGK.prc_page (p_tableName in varchar2, --表名 p_strWhere in varchar2, --查询条件 p_orderColumn in varchar2, --排序的列 p_orderStyle in varchar2, --排序方式 p_curPage in out Number, --当前页 p_pageSize in out Number, --每页显示记录条

Oracle分页查询语句的写法(转)

分页查询是我们在使用数据库系统时经常要使用到的,下文对Oracle数据库系统中的分页查询语句作了详细的介绍,供您参考. Oracle分页查询语句使我们最常用的语句之一,下面就为您介绍的Oracle分页查询语句的用法,如果您对此方面感兴趣的话,不妨一看. Oracle分页查询语句基本上可以按照本文给出的格式来进行套用.Oracle分分页查询格式: SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHER

ORACLE 分页查询

Oracle之分页查询 Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用. 分页查询格式: SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40 ) WHERE RN >= 21 其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句.ROWNUM <= 40和RN >= 21控制分页查询的每页的范围.

oracle 分页查询数据重复问题

最近在做项目的时候发现一个问题,oracle 在查询分页数据的时候,有几条数据重复查询了,并且有几条数据在分页的时候消失了.百度了一下发现,ORACLE 在查询数据的时候返回的行不是固定的,他只是按照顺序从数据中读取符合条件的数据返回到客户端,给用户误解为默认排序. 然而,当我加上排序的时候,还是查询有重复的数据,(指第一页数据在第二页也查询出来了),这是我就疑问了,当我检查数据的时候,发现我排序的字段有空的情况,而且有很多条,导致排序返回的 伪列并不是唯一的. 总结: oracle 分页查询数

oracle分页查询结果集重复问题&解决方法

做项目时,无意间发现了分页上的一个bug,在此记录一下: 首先手动将后台输出的sql语句复制进oracle中查看,以便排查错误,对比以下视图前10条的结果集与10到20条的结果集,发现大部分记录出现重复现象,SQL语句如下: --前10条记录 select *   from (select row_.*, rownum rownum_           from (select t.idcard, count(1)                   from sampling.v_unvou

2.oracle分页,找到员工表中薪水大于本部门平均薪水的员工

 ROWNUM的知识点 A ROWNUM按照oracle的默认机制生成. B rownum只能使用<=  <号,不能使用>  >= rownum的实现机制 rownum表示,返回的结果集的行号(是一个属性,固化到一行之中,不会因为你排序,而发生变化).没有第一行,就没有第二行:没有第二行就没有第三行. Oracle Top-N select rownum,empno,ename,sal from (select empno,ename,sal from emp order by

Oracle分页在Web上的首页

本例子代码,只讲Oracle分页的常用的一种方法在Web中的使用,不涉及MVC,代码优化等东西,高手请飘过.新手可以参考. --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

ORACLE分页SQL

1,使用rownum SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40 ) WHERE RN >= 21 2,使用between SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A ) WHERE RN BETWEEN 21 AND 40 ORACLE分页SQL,布布扣,b

[Oracle]关于Oracle分页写法的性能分析及ROWNUM说明

关于分页写法的性能分析及ROWNUM的补充说明 分页写法 一.测试前数据准备 SQL> SELECT COUNT(*) FROM BPM_PROCVAR; COUNT(*) ---------- 2121400 1.分页写法一 SELECT * FROM (SELECT ROWNUM RN, A.* FROM (SELECT * FROM BPM_PROCVAR ORDER BY VARID) A WHERE ROWNUM <= 40) B WHERE B.RN >= 21; 查询结果:

MySQL oracle 分页

(1)MySql的Limit m,n语句 Limit后的两个参数中,参数m是起始下标,它从0开始:参数n是返回的记录数.我们需要分页的话指定这两个值即可. 比如:查询10行记录,起始行从3开始 SELECT * FROM emp LIMIT 3, 10; (2)Oracle数据库的rownum 子查询要包含在括号内. 将子查询放在比较条件的右侧. 单行操作符对应单行子查询,多行操作符对应多行子查询. 子查询可以出现在select,from,where,having子句中 子查询不可以出现在gro