本文参考链接:http://blog.sina.com.cn/s/blog_8604ca230100vro9.html
探索查询语句:
--分页参数: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;
有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(orderby 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)+1AND page*size; http://www.cnblogs.com/jay763190097/p/6813792.html
但是相比前面的并没有什么优势。
相关推荐
通过以上分析可以看出,在Oracle中实现高效的分页查询需要综合考虑查询结构、索引使用以及查询优化器的选择等多个方面。合理地运用基于`ROWNUM`的分页查询方法及其优化技巧,可以显著提升系统的性能表现和用户体验。
总结来说,“ssh+oracle分页”涉及了SSH框架整合、数据库操作、前端展示等多个环节,需要综合运用各种技术和工具,确保数据分页的高效性和用户体验。理解并掌握这些知识点,对提升Java Web开发者的能力大有裨益。
总结来说,面向对象的Java JDBC分页查询涉及到创建Page类来存储分页信息,构造Oracle兼容的SQL语句,以及使用PreparedStatement执行查询。在实际开发中,我们还需要关注性能优化、异常处理和代码的可维护性,确保...
总结来说,Oracle的分页查询涉及到ROWNUM伪列的使用和优化策略的选择。理解这两种方法的效率差异以及何时使用HINTs来指导优化器,对于编写高效、性能优良的分页查询至关重要。在设计数据库查询时,考虑到这些因素...
总结来说,Oracle和JSP结合实现分页涉及以下几个步骤:在Oracle中构造分页查询,使用JDBC在Servlet中执行查询,然后在JSP页面中展示数据。理解并熟练掌握这些步骤对于开发高效、用户友好的数据驱动网站至关重要。在...
这种方法既支持ORDER BY,又避免了全表扫描和子查询,因此在大数据量分页时可能更为高效。 总结来说,ROWNUM是最基础的分页方式,适合小数据量或无需排序的情况;ROWNUM结合子查询能保证有序分页,但效率较低;...
Oracle数据库在处理大量数据时,为了提高...根据实际场景选择合适的方法,同时注意优化查询以提高性能,是确保高效分页的关键。在Eclipse这样的开发环境中,可以通过编写和运行SQL语句来验证和调试这些分页查询的实现。
总结来说,Oracle存储过程实现分页查询的关键在于动态构造SQL语句,结合ROWNUM或ROW_NUMBER()来实现分页。理解这一机制有助于我们在处理大量数据时编写高效、可复用的代码。在实际应用中,根据具体需求和数据库设计...
为了更高效地实现分页查询,有两种不同的写法可以考虑: 1. **第一种写法**: ```sql SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM ) WHERE RN >= 21 ``` 2....
在IT行业中,数据库管理和数据检索是至关重要的环节,...通过编写Action类处理请求,利用Oracle的ROWNUM进行分页查询,并通过JDBC接口与数据库交互,最后通过分页模型类管理和展示数据,从而实现高效、易用的分页功能。
总结,Oracle分页结合Servlet、AJAX、JSON和jQuery可以构建出高性能、用户体验良好的分页应用。Servlet处理后端逻辑和数据交互,AJAX实现前后端无刷新通信,JSON作为数据交换格式,而jQuery则负责前端的数据解析和...
总结来说,Oracle分页存储过程是通过动态构造SQL语句,结合输入的分页参数,计算出总页数,并返回指定页的数据。这种方式在处理大量数据时提高了效率,同时也提供了灵活的查询控制。通过包装这些逻辑在存储过程中,...
在Oracle数据库中实现分页查询是一项常见的需求,尤其是在处理大量数据时。本文将介绍一种利用简单SQL语句来实现Oracle数据库分页的方法,这种方法不依赖于复杂的PL/SQL过程或函数,而是通过SQL查询的巧妙设计来达到...
本文将详细介绍如何在Oracle数据库中实现高效、灵活的分页功能。 #### 一、Oracle分页原理 Oracle中的分页主要通过`ROWNUM`伪列来实现。`ROWNUM`为每一行分配一个唯一的编号,起始值为1。通过限制`ROWNUM`的范围,...
对于想要学习如何在PB环境中处理大量数据并实现高效分页的开发者来说,这是一个有价值的参考资料。如果你没有数据库的表结构,可以自己根据需求创建相应的表并填充数据,以便更好地理解和应用这个Demo。
Oracle数据库在处理大数据量时,分页查询是一个非常重要的功能,它可以帮助用户高效地浏览和检索数据,而无需一次性加载所有结果。Oracle提供多种方法来实现分页,这些方法各有优缺点,适用于不同的场景。本篇文章将...
- 对于需要高效分页查询的应用,推荐使用`ROW_NUMBER()`函数。 通过以上分析和示例,我们可以看到,在Oracle数据库中利用`ROW_NUMBER()`函数实现分页是一种既简洁又高效的解决方案。它不仅解决了传统分页方法中...
### Oracle、SQL、MySQL 实现分页查询方法详解 在数据库操作中,分页查询是一项非常重要的技术,尤其是在处理大量数据时。本文将基于提供的文件信息,深入探讨三种不同的分页查询方法及其在Oracle、SQL Server...
总结来说,Struts2.0处理HTTP请求,Hibernate管理数据持久化,而Oracle提供高效的数据存储和查询能力。在处理分页问题时,需要巧妙地结合这三个组件,合理设计和实现分页逻辑,以提高系统的响应速度和用户体验。通过...