Oracle实现分页时,需要引入一个rownum的函数,rownum可以给记录一个类似于id的字段。

以下收整理了常用的几种sql分页算法,数据库以Oracle中emp为例。查询结果如下:

SQL> select * from emp;

EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO

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

7369 SMITH      CLERK      7902 1980/12/17     800.00               20

7499 ALLEN      SALESMAN   7698 1981/2/20     1600.00    300.00     30

7521 WARD       SALESMAN   7698 1981/2/22     1250.00    500.00     30

7566 JONES      MANAGER    7839 1981/4/2      2975.00               20

7654 MARTIN     SALESMAN   7698 1981/9/28     1250.00   1400.00     30

7698 BLAKE      MANAGER    7839 1981/5/1      2850.00               30

7782 CLARK      MANAGER    7839 1981/6/9      2450.00               10

7788 SCOTT      ANALYST    7566 1987/4/19     3000.00               20

7839 KING       PRESIDENT       1981/11/17    5000.00               10

7844 TURNER     SALESMAN   7698 1981/9/8      1500.00      0.00     30

7876 ADAMS      CLERK      7788 1987/5/23     1100.00               20

7900 JAMES      CLERK      7698 1981/12/3      950.00               30

7902 FORD       ANALYST    7566 1981/12/3     3000.00               20

7934 MILLER     CLERK      7782 1982/1/23     1300.00               10

14 rows selected
分页方法1:使用嵌套查询

SQL> select * from ( select t1.* , rownum as n from emp t1 where rownum  <= 15 ) where n >= 10;

EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO          N

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

7844 TURNER     SALESMAN   7698 1981/9/8      1500.00      0.00     30         10

7876 ADAMS      CLERK      7788 1987/5/23     1100.00               20         11

7900 JAMES      CLERK      7698 1981/12/3      950.00               30         12

7902 FORD       ANALYST    7566 1981/12/3     3000.00               20         13

7934 MILLER     CLERK      7782 1982/1/23     1300.00               10         14

分页方法2:使用minus

SQL> select * from emp where rownum <= 14 minus select * from emp where rownum < 10;

EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO

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

7844 TURNER     SALESMAN   7698 1981/9/8      1500.00      0.00     30

7876 ADAMS      CLERK      7788 1987/5/23     1100.00               20

7900 JAMES      CLERK      7698 1981/12/3      950.00               30

7902 FORD       ANALYST    7566 1981/12/3     3000.00               20

7934 MILLER     CLERK      7782 1982/1/23     1300.00               10

在方法二中,如果minus后的查询语句执行where rownum > 10时,为什么不能查询到任何的记录呢?

ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列(强调:先有结果集后再添加伪列)。

简单的说 rownum 是对符合条件结果的序列号。它总是从1开始排起的。不能对rownum用">"。它与rownum实现的机制是有关的。同时, 也无法使用rownum = n(n>1的自然数)。rownum都是从1开始。

分页方法3 : 使用rowid

SQL> select * from emp where rowid in ( select rid from (select rowid as rid, rownum as id from emp t where rownum < 15) where id >= 10 );

EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO

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

7876 ADAMS      CLERK      7788 1987/5/23     1100.00               20

7844 TURNER     SALESMAN   7698 1981/9/8      1500.00      0.00     30

7900 JAMES      CLERK      7698 1981/12/3      950.00               30

7902 FORD       ANALYST    7566 1981/12/3     3000.00               20

7934 MILLER     CLERK      7782 1982/1/23     1300.00               10

方法四:使用分析函数

SQL> select * from ( select t.* , row_number() over(order by ename) as num from emp t ) where num between 10 and 15;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO NUM

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

7934 MILLER CLERK 7782 1982/1/23 1300.00 10 10

7788 SCOTT ANALYST 7566 1987/4/19 3000.00 20 11

7369 SMITH CLERK 7902 1980/12/17 800.00 20 12

7844 TURNER SALESMAN 7698 1981/9/8 1500.00 0.00 30 13

7521 WARD SALESMAN 7698 1981/2/22 1250.00 500.00 30 14

方法五:使用rownum伪列查询所有记录后,外层使用between and 或 大于 小于

SQL> select * from (select t.* , rownum as num from emp t) where num between 10 and 15;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO NUM

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

7844 TURNER SALESMAN 7698 1981/9/8 1500.00 0.00 30 10

7876 ADAMS CLERK 7788 1987/5/23 1100.00 20 11

7900 JAMES CLERK 7698 1981/12/3 950.00 30 12

7902 FORD ANALYST 7566 1981/12/3 3000.00 20 13

7934 MILLER CLERK 7782 1982/1/23 1300.00 10 14

转载于:https://www.cnblogs.com/henuyuxiang/p/4076730.html

oracle sql 分页相关推荐

  1. oracle sql 分页 很慢,一次分页SQL优化

    开发说业务有个统计跑不出结果,我让他把sql给我,他说不清楚,那我就直接才消耗时间最长了sql了,查找sql如下SELECT inst_id, sql_id, sql_fulltext, round( ...

  2. oracle接收输入参数,Oracle带输入输出参数存储过程(包括sql分页功能)

    记录一下,免得以后忘记了又要到处去找. begin /*这里不能直接执行select语句但可以直接执行update.delete.insert语句*/ end里面不能接执行select语句,声明会话级 ...

  3. oracle查询实现分页,Oracle实现分页查询的SQL语法汇总

    本文实例汇总了Oracle实现分页查询的sql语法,整理给大家供大家参考之用,详情如下: 1.无ORDER BY排序的写法.(效率最高) 经过测试,此方法成本最低,只嵌套一层,速度最快!即使查询的数据 ...

  4. oracle distinct分页优化_Oracle SQL性能优化最常用的40条建议

    关于Oracle SQL优化的内容,这一篇应该能满足常规大部分的应用优化需求,整整40条优化建议,干货满满. 1. SQL语句执行步骤 语法分析> 语义分析> 视图转换 >表达式转换 ...

  5. Oracle中分页查询语句

    Oracle分页查询语句使我们最常用的语句之一,下面就为您介绍的Oracle分页查询语句的用法,如果您对此方面感兴趣的话,不妨一看. Oracle分页查询语句基本上可以按照本文给出的格式来进行套用. ...

  6. oracle分页的方法,Oracle数据库分页的集中方法(三种方法)

    在 做项目中用到了分页,下面说一下oracle分页的方法; 采用伪列 rownum 查询前10条记录 [sql] select * from t_user t where ROWNUM <10; ...

  7. C#调用Oracle存储过程分页

    直接调用Oracle中的存储过程完成对表的分页,对代码封闭程度高,执行高效.以下为C#分页类代码,包括Oracle数据库 端存储过程PLSQL代码. //    程序调用示例: // int tota ...

  8. 常用3种数据库的Sql分页

    在程序的开发过程中,处理分页是大家接触比较频繁的事件,因为现在软件基本上都是与数据库进行挂钓的.但效率又是我们所追求的,如果是像原来那样把所有满足条件的记录全部都选择出来,再去进行分页处理,那么就会多 ...

  9. Oracle的分页实现

    转载自  Oracle的分页实现 在Oracle中实现分页的方法大致分为两种,用ROWNUM关键字和用ROWID关键字,下面来详细介绍一下: 1.ROWNUM 其代码为: SELECT *FROM ( ...

最新文章

  1. 斯坦福2021版图机器学习课程完结,视频、PPT全放送,大神主讲
  2. vim 编程常用的指令和快捷键
  3. Redis 6.0 正式版终于发布了!除了多线程还有什么新功能?
  4. 查看mysql错误日志定位mysql错误
  5. Codeforces 758F Geometrical Progression
  6. 用 JNI 进行 Java 编程(1)
  7. Ubuntu20.04下载安装CMake
  8. openwrt路由器samba拒绝访问
  9. Gossip 协议详解
  10. 二分查找和三分求单峰函数极值
  11. Implement AWS SQS and Lambda to decouple process flow
  12. 狂神说Java---java学习笔记(图片有些问题,有时间将图片从电脑上传上来)
  13. 小红书话题笔记是什么意思?话题笔记发布步骤流程分享
  14. 红米Note12 Turbo和真我GT Neo5 SE参数对比 红米Note12 Turbo和真我GT Neo5 SE
  15. 51单片机玩转物联网基础篇05-控制继电器
  16. 请问nj文件如何用html的解析,nj.renderH
  17. Cisco统一智能呼叫中心简介
  18. MT6755/MT6757资料介绍,MT6755/MT6757处理器参数对比
  19. blackberry j2me 发送SMS短信
  20. 最新芒果TV视频下载方法-马赛克视频助手

热门文章

  1. [GXOI/GZOI2019]旧词——树链剖分+线段树
  2. mysql新增用户和删除用户
  3. 解决git push 中remote: Permission to xxxxx.git denied to xxx. fatal: unable to access xxxx 403(转)
  4. ubuntu16.04下面xfce4没有声音
  5. 修饰符在python函数中的用法详细解释
  6. Python学习笔记——time模块和datatime模块【时间处理】
  7. 论文阅读笔记:A Fast Triangle-Triangle Intersection Test
  8. GStreamer(二)
  9. linux为什么创建不了分区,linux下扩容磁盘扩展分区解决因无法创建新分区不能扩容lvm问题...
  10. 产品原型设计的参考步骤