方式一:
SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
)
WHERE RN BETWEEN 3*(3-1)+1 AND 3*3
方式二分页查询格式:
SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME ORDER BY VALUE) A
WHERE ROWNUM <= 20*2
)
WHERE RN >20*(2-1)
对比这两种写法,绝大多数的情况下,第一个查询的效率比第二个高得多。
这是由于CBO优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。对于第一个查询语句,第二层的查询条件WHERE ROWNUM <= 40就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。
而第二个查询语句,由于查询条件BETWEEN 21 AND 40是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层(即使推到最内层也没有意义,因为最内层查询不知道RN代表什么)。因此,对于第二个查询语句,Oracle最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成,显然这个效率要比第一个查询低得多。
上面分析的查询不仅仅是针对单表的简单查询,对于最内层查询是复杂的多表联合查询或最内层查询包含排序的情况一样有效。
这里就不对包含排序的查询进行说明了,下一篇文章会通过例子来详细说明。下面简单讨论一下多表联合的情况。对于最常见的等值表连接查询,CBO一般可能会采用两种连接方式NESTED LOOP和HASH JOIN(MERGE JOIN效率比HASH JOIN效率低,一般CBO不会考虑)。在这里,由于使用了分页,因此指定了一个返回的最大记录数,NESTED LOOP在返回记录数超过最大值时可以马上停止并将结果返回给中间层,而HASH JOIN必须处理完所有结果集(MERGE JOIN也是)。那么在大部分的情况下,对于分页查询选择NESTED LOOP作为查询的连接方法具有较高的效率(分页查询的时候绝大部分的情况是查询前几页的数据,越靠后面的页数访问几率越小)。
如果不介意在系统中使用HINT的话,可以将分页的查询语句改写为:
SELECT /*+ FIRST_ROWS */ * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
WHERE ROWNUM <= 40
)
WHERE RN >= 21
使用row_number()高效分页
SELECT T.* FROM(
SELECT S.*,
ROW_NUMBER() OVER(ORDER BY VALUE) AS NUM
FROM TABLENAME S
) T
WHERE NUM BETWEEN 3*(1-1)+1 AND 3*1
还有使用Minus关键字实现分页:
select * from studybook where rownum<=3*2
minus
select * from studybook where rownum<=3*(2-1)
*********************************************************************************
Mysql分页采用limt关键字
select * from t_order limit 5,10; #返回第6-15行数据
select * from t_order limit 5; #返回前5行
select * from t_order limit 0,5; #返回前5行
Mssql 2000分页采用top关键字(20005以上版本也支持关键字rownum)
Select top 10 * from t_order where id not in (select id from t_order where id>5 ); //返回第6到15行数据
其中10表示取10记录 5表示从第5条记录开始取
分享到:
相关推荐
oracle数据库级分页 老师写的自己项目中都用这个
环境: Oracle 9i 本例子使用简单的SQL语句实现...只要看懂了分页公式,那么这是一个通用的Oracle数据库分页动作(可以使用PHP, JAVA, ASP .NET等其他语言)。 分页公式注释非常详细,是非常实用的Oracle分页语句!!
该文档详细描述了三大数据库的分页sql语句。
几条常见的数据库分页SQL 语句,针对oracle,sqlserver,mysql三种常见数据库的分页显示。
主要介绍了java连接oracle、sqlserver和mysql语句,以及连接这些数据库的分页语句
3大数据库(Sql-Server,MySql和Oracle)的分页SQL语句实现
几种数据库常见分页sql 我们在编写MIS系统和Web应用程序等系统时,都涉及到与数据库...根据自己使用过的内容,把常见数据库SQL Server,Oracle和MySQL的分页语句,从数据库表中的第M条数据开始取N条记录的语句总结如下:
C#版Oracle数据库通用操作类,包含了基础连接、执行基础语句、返回参数执行、dataset分页执行等简单oracle命令执行及哈稀表自动插入数据库等高级任务执行等。
jsp 新闻管理系统毕业设计 代码简单易懂 并且还有大量的注释
Oracle中实现分页查询的SQL命令 //curPage是当前页面,pageCount是每页显示行数 //rownum是伪列,相当于表中每一列的标识列(可以理解为行号),需要显式的提取出来并取一个别名
购物系统,java web,oracle建表,分页功能,servlet+jsp
我们在编写MIS系统和Web应用程序等系统时,都涉及到与数据库的交互,如果数据库中...根据自己使用过的内容,把常见数据库Sql Server,Oracle和My sql的分页语句,从数据库表中的第M条数据开始取N条记录的语句总结如下:
Oracle,sql语句 分页实现 直接可以烤到代码中运行
讲解oracle数据库操作数据表的分页过程,简单明了,可以直接套用,希望对大家学习oracle会有帮助
oracle 中没有像其他数据库那样用top来实现分页,但oracle提供了rownum 通过它也可以实现分页方法。
msql和oracle分页查询语句笔记
SQL Server 、MySQL 、Oracle数据库分页SQL语句
七、 SQL语句中的分支 15 7.1分支表达式 15 7.2分支函数 15 八、 组函数 16 8.1报表统计常用 16 8.2缺省情况组函数处理什么值 16 8.3当组函数要处理的所有值都为null时 16 8.4行级信息和组级信息 16 九、 group by...
此文以oracle数据库中的SCOTT用户的EMP表为例,用PL/SQL Developer编写一个分页存储过程,要求是:可以输入表名,每页显示记录数,当前页,返回总记录数,总页数和返回的结果集。 由于需要返回查询出来的结果集,...
注意:查询sql语句中必须包含rownum字段,别名是rn。rownum是Oracle关键字。 存储是来自http://blog.csdn.net/pharaohsprince/archive/2006/04/12/660800.aspx。 对存储过程做了简单的修改方法程序的调用。 效率...