计算机系统应用教程网站

网站首页 > 技术文章 正文

Oracle分页查询语句,面试不再怕!

btikc 2024-10-16 08:22:17 技术文章 9 ℃ 0 评论

实际开发过程中难免接触到Oracle数据库。而数据库的分页又是我们最常用的语句之一,而且面试问的频率也很高。Oracle数据库的分页不像Mysql数据库用一个limit就搞定那么简单。该篇文章为大家介绍Oracle数据库的通用写法,以便大家熟悉Oracle数据库的分页写法。

分页查询格式:

其中最内层的查询语句SELECT * FROM 表名表示不进行翻页的原始查询语句。ROWNUM <= 20和RN >= 11控制分页查询的每页范围。

上述的Oracle分页查询格式,在大多数情况拥有较高的效率。

查询数据11-20条的记录有两种方法,一种是上述例子中展示的在查询的第二层通过ROWNUM <= 20来控制最大值,在查询的最外层控制最小值。而另一种方式是去掉查询第二层的WHERE ROWNUM <= 20语句,在查询的最外层控制分页的最小值和最大值。查询语句如下:

对比这两种写法,绝大多数的情况下,第一个查询的效率比第二个高得多。

这是因为在CBO 优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。对于第一个查询语句,第二层的查询条件WHERE ROWNUM <= 20就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。

而第二个查询语句,由于查询条件BETWEEN 11 AND 20是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层。因此,对于第二个查询语句,Oracle最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成,显然这个效率要比第一个查询低得多。

对于第一种理解的话还是从里面向外面更好一些,先是从一个表中获得数据select * from 表名,再给这个表赋上RN的值并且将索取的行数确定为20行select a.*,rownum rn from (select * from 表名) a where rownum<=20,之后再确定从哪一行开始select * from (select a.*,rownum rn from (selecct * from table_name) a where rownum<=20) where rn>=11

上面分析的查询不仅仅是针对单表的简单查询,对于最内层查询是复杂的多表联合查询或最内层查询包含排序的情况一样有效。

最后祝大家工作顺利,天天开心!!!

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表