您现在的位置是:网站首页>>信息浏览 文章详情

oracle的分页查询
2019-05-23 12:16 许多年以后 908

mysql的反应非常的简单,我们只要用到limit这个关键字就行,但是orcale的分页查询有点复杂,主要是要用到ROWNUM 这个字段

语法格式

  1. 格式1(推荐)
  2. SELECT * FROM
  3. (
  4. SELECT temp.*, ROWNUM RN
  5. FROM (SELECT * FROM 表名) temp
  6. WHERE ROWNUM <=end (page*pagesize)
  7. )
  8. WHERE RN >start (page-1*pagesize)
  9. 格式2
  10. SELECT * FROM
  11. (
  12. SELECT temp.*, ROWNUM RN
  13. FROM (SELECT * FROM TABLE_NAME) temp
  14. )
  15. WHERE RN BETWEEN start (page-1*pagesize+1) AND end (page*pagesize)

由于​CBO优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。对于第2个查询语句,第二层的查询条件WHERE ROWNUM <= 40就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。 而第1个查询语句,由于查询条件BETWEEN 21 AND 40是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层(即使推到最内层也没有意义,因为最内层查询不知道RN代表什么)。因此,对于第1个查询语句,Oracle最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成,显然这个效率要比第一个查询低得多。

注意:

  1. rownum不能以任何基表的名称作为前缀。   
  2. 子查询中的rownum必须要有别名,否则还是不会查出记录来,这是因为rownum不是某个表的列,如果不起别名的话,无法知道rownum是子查询的列还是主查询的列。   
  3. 查询rownum在某区间的数据,rownum对小于某值的查询条件为true,rownum对于大于某值的查询条件直接认为是false的,但是可以间接的让它转为认为是true的。那就必须使用子查询。
赞 (108)
文章出处:书生个人博客          转载注明下哦!o(≧v≦)o~~

标签: oracle分页查询

相似文章:


随便说两句
请先登录
遵守国家法律法规,请勿回复无意义内容,请不要回复嵌套过多的楼层!