探索查询语句:

--分页参数:size = 20 page = 2

--没有order by的查询

-- 嵌套子查询,两次筛选(推荐使用)

--SELECT *

-- FROM (SELECT ROWNUM AS rowno, t.*

-- FROM DONORINFO t

-- WHERE t.BIRTHDAY BETWEEN TO_DATE ('19800101', 'yyyymmdd')

-- AND TO_DATE ('20060731', 'yyyymmdd')

-- AND ROWNUM <= 20*2) table_alias

-- WHERE table_alias.rowno > 20*(2-1); --耗时0.05s

-- 一次筛选(数据量大的时候,第一次查询的数据量过大,明显比上面慢,不推荐)

--select * from(

--SELECT ROWNUM AS rowno, t.*

--FROM DONORINFO t

--WHERE t.BIRTHDAY BETWEEN TO_DATE ('19800101', 'yyyymmdd') AND TO_DATE ('20060731', 'yyyymmdd')

--) r

--where r.rowno BETWEEN 20*(2-1)+1 and 20*2; --耗时0.46s

--有order by的查询

--嵌套子查询,两次筛选(推荐使用)

--SELECT *

--FROM (SELECT ROWNUM AS rowno,r.*

-- FROM(

-- SELECT * FROM DONORINFO t

-- WHERE t.BIRTHDAY BETWEEN TO_DATE ('19800101', 'yyyymmdd')

-- AND TO_DATE ('20060731', 'yyyymmdd')

-- ORDER BY t.BIRTHDAY desc

-- ) r

-- where ROWNUM <= 20*2

-- ) table_alias

-- WHERE table_alias.rowno > 20*(2-1); --耗时0.744s

-- 一次筛选(数据量大的时候,第一次查询的数据量过大,明显比上面慢,不推荐)

--select * from (

--SELECT ROWNUM AS rowno,r.*

--FROM(

--SELECT * FROM DONORINFO t

--WHERE t.BIRTHDAY BETWEEN TO_DATE ('19800101', 'yyyymmdd')

--AND TO_DATE ('20060731', 'yyyymmdd')

--ORDER BY t.BIRTHDAY desc

--) r

----where ROWNUM <= 20; --这里用>查不到数据 =也查不到数据 <= 或者 < 可以查到数据

----where ROWNUM BETWEEN 20*(2-1)+1 AND 20*2; --查不到数据

----where ROWNUM <=20*2 and ROWNUM > 20*(2-1); --查不到数据

----这是因为查询时,第一条生成的rownum为1,1>20不成立,1=20也不成立,所以这条数据就作废了,依次类推,这样就查不到任何一条数据

--) t

--where t.rowno <=20*2 and t.rowno > 20*(2-1); --可以查到数据耗时:3.924s

---- where t.rowno BETWEEN 20*(2-1)+1 AND 20*2; --可以查到数据耗时:3.919s

--采用row_number() over 分页函数

--select *

--from(select d.*,row_number() over(order by d.BIRTHDAY) as rownumber

-- from DONORINFO d

-- WHERE d.BIRTHDAY BETWEEN TO_DATE ('19800101', 'yyyymmdd')

-- AND TO_DATE ('20060731', 'yyyymmdd')

-- ) p

--where p.rownumber BETWEEN 20*(2-1)+1 AND 20*2; --耗时0.812s

select * from (

select *

from(select d.*,row_number() over(order by d.BIRTHDAY) as rownumber

from DONORINFO d

WHERE d.BIRTHDAY BETWEEN TO_DATE ('19800101', 'yyyymmdd')

AND TO_DATE ('20060731', 'yyyymmdd')

) p

where p.rownumber <20*2

) where rownumber > 20*(2-1); -- 耗时0.813s

从以上探索比较,我们得知:

1、ROWNUM

rownum总是从1开始的,第一条不满足去掉的话,第二条的rownum 又成了1。依此类推,所以永远没有满足条件的记录。

可以这样理解:rownum是一个序列,是Oracle数据库从数据文件或缓冲区中读取数据的顺序。

它取得第一条记录则rownum值为1,第二条为2。依次类推。

当使用“>、>=、=、between...and”这些条件时,从缓冲区或数据文件中得到的第一条记录的rownum为1,不符合sql语句的条件,会被删除,接着取下条。

下条的rownum还会是1,又被删除,依次类推,便没有了数据。

所以上限条件必须放在子查询,而下限条件必须放在外层查询。

2、between  and 和 >= and <=

这两者查询效率上来说没有区别,between and 最终也是转为>= and <=

所以select * from (select * from a where a.time >= to_date('19920324','yyyymmdd')) b where b.time <= to_date('20170324','yyyymmdd')

这样的嵌套是没有必要的,可以直接用between and。

3、Oracle通用分页格式

对于没有order by语句的分页:

SELECT *

FROM (SELECT ROWNUM AS rowno, t.*

FROM DONORINFO t

WHERE t.BIRTHDAY BETWEEN TO_DATE ('19800101', 'yyyymmdd')

AND TO_DATE ('20060731', 'yyyymmdd')

AND ROWNUM <= page*size) table_alias

WHERE table_alias.rowno > (page-1)*size;

SELECT *

FROM (SELECT ROWNUM AS rowno, t.*

FROM BDC_XM t

where ROWNUM <= 100) a

WHERE a.rowno > 80;

有order by语句的分页

SELECT *

FROM (SELECT ROWNUM AS rowno,r.*

FROM(SELECT * FROM DONORINFO t

WHERE t.BIRTHDAY BETWEEN TO_DATE ('19800101', 'yyyymmdd')

AND TO_DATE ('20060731', 'yyyymmdd')

ORDER BY t.BIRTHDAY desc

) r

where ROWNUM <= page*size

) table_alias

WHERE table_alias.rowno > (page-1)*size;

另外我们也可以使用row_number() over函数:

select *

from(select d.*,row_number() over(order by d.BIRTHDAY) as rownumber

from DONORINFO d

WHERE d.BIRTHDAY BETWEEN TO_DATE ('19800101', 'yyyymmdd')

AND TO_DATE ('20060731', 'yyyymmdd')

) p

where p.rownumber BETWEEN size*(page-1)+1 AND page*size;

但是相比前面的并没有什么优势。

java oracle数据库高效分页查询_oracle高效分页查询总结相关推荐

  1. Oracle数据库SQL语句(四)—子查询(嵌套查询)

    Oracle数据库SQL语句(四) 子查询(嵌套查询) 1.单行子查询 SELECT * FROM stuWHERE ID > (SELECT ID FROM stu WHERE NAME =' ...

  2. JAVA实现数据库编程第三章_[数据库]使用Java实现数据库编程—03 第三章 高级查询(一)...

    [数据库]使用Java实现数据库编程-03 第三章 高级查询(一) 0 2018-07-21 03:01:10 1.修改表:(1)修改表名语法: ALTER TABLE RENAME [ TO ] : ...

  3. Oracle数据库(一):安装函数查询条件查询

    文章目录 1.课程总介绍 Oracle由来&埃里森的身世 为什么学习Oracle 2.Oracle安装与配置 3.正式学习部分 Oracle体系结构 Oracle和MYSQL的差别 SQL的简 ...

  4. 【从零开始学习Oracle数据库】(1)建表与简单查询

    一.常用数据库软件 大型数据库 Oracle Oracle是著名的Oracle(甲骨文)公司的数据库产品 , 它是世界上第一个商品化的关系型数据库管理系统 , 也是第一个推出和数据库结合的第四代语言开 ...

  5. java+oracle数据库锁,数据库学习之Oracle数据库\记录被另一个用户锁住\解决方法...

    1.先来看看为什么会出锁住: 数据库是一个多用户使用的共享资源.当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数 ...

  6. Oracle数据库表被锁了,如何查询和解锁

    1.锁表原因 可能是修改表中的数据,忘了提交事务会造成锁表. Oracle数据库操作中,我们有时会用到锁表查询以及解锁和kill进程等操作. 2.锁表查询的代码有以下的形式 select count( ...

  7. oracle数据库时分秒格式_Oracle如何输出指定格式的日期时间数据呢?

    摘要: 下文讲述Oracle数据库输出指定的日期时间格式的方法分享,如下所示: 实现思路: 使用TO_CHAR系统函数,指定输出格式为'*******', 即可将日期时间转换为指定格式的字符串 如: ...

  8. 【Oracle 数据库】奶妈式教程 day09 子查询

    子查询 子查询指一个查询语句嵌套在另一个查询语句内部的查询 1.from后面的子查询 举例:查询员工的姓名和他上级的姓名 SELECT E.*, E2.EMPNO, E2.ENAME MNAME, E ...

  9. case when嵌套子查询_Oracle基础连接查询!!!

    1. 字符到日期的转换 (1) 在Oracle中将字符转换为日期的函数是什么? (2) To_date('字符','转换格式') To_date('2019-03-04','yyyy-MM-dd') ...

最新文章

  1. CHIL-ORACLE-主外键约束(primary key / foreign key)
  2. [scala-spark]11. RDD控制操作
  3. vue小米商城源代码_微信商城信息管理系统(java后台+小程序)
  4. 使用IDM下载,不适用默认浏览器下载
  5. 信息奥赛一本通(1231:最小新整数)
  6. Shell——test 命令
  7. 第九章:在Spark集群上掌握比较重要的图操作之Structural Operators
  8. [转] PostgreSQL的PITR技术(Point-In-Time-Recovery)
  9. 《System语言详解》——1.SystemTap概述
  10. 全网首发:gpg: gpg-agent 在此次会话中无法使用的解决办法
  11. 决策支持系统是什么?
  12. P1338 末日的传说(C++_数论_递推)
  13. 网络会议openmeetings下的openmeetings-util文件分析7
  14. 口算加密php怎么使用,从数盲到口算 ——带你玩转RSA加密算法(一)
  15. Hyper-V虚拟机安装XP系统
  16. [Leetcode/Python3] 第204场周赛题解
  17. JS创建对象和事件绑定
  18. Cisco NSF 与NSR 与GR
  19. c语言把一个文件中的内容复制到另外一个文件中的代码的另外一种写法
  20. big.js、bignumber.js 和 decimal.js 的区别

热门文章

  1. intellij idea 常见遇到的问题整理
  2. tensorflow 1.x Saver(保存与加载模型) 预测
  3. 固件安全性—防止内存损坏和注入攻击
  4. arm,asic,dsp,fpga,mcu,soc各自的特点
  5. 2021年大数据Hive(十一):Hive调优
  6. 2021年大数据ZooKeeper(一):ZooKeeper基本知识
  7. api.php t.cn,PHP通过调用新浪API生成t.cn格式短网址链接的方法详解
  8. centeos7安装mariadb
  9. 线段树——HDU - 1698
  10. 一篇文章让你读懂Pivotal的GemFire家族产品