`
cxshun
  • 浏览: 725306 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

oracle分页小谈

阅读更多

今天做项目时要实现分页功能,以前只在mysql上弄过,oracle倒没试过,但知道有这样一个rownum这个东西。

但这个东西也不是那么容易用的,还是有蛮多地方要注意的。它不是物理上存在的一列,而是oracle自己在结果集中进行添加的。

首先我们来看一下我们的表结构先:

我们新建一个表:

  也就一个字段ID而已,这方便我们直接地看到结果。

我们先随便插入几条数据:

先弄进去5条吧。

我们直接来一个:

select rownum,id from test;

  我们看到结果:

很高兴吧,都是一模一样的,ronwum和ID是一样的,方便我们看。

 

但结果看到的结果可能就会让你郁闷啦。

 

继续下来,我们删除几条数据再插入几条:

看到结果,我们是删除了后面两条,4,5这两条记录,而插入了8,9这两条记录。我们再来执行查询:

select rownum,id from test;

我们看到ID为8,9的已经取代了之前的4,5得到了rownum为4,5。这个说明了什么,说明了rownum并不是物理存在的,如果是物理存在的那么它肯定会随着4,5的删除而把rownum的4,5都删除了,但它并没有,而是把新插入的记录的rownum作为此值,这说明rownum肯定只是一个逻辑上的列,它有一个专门的名称——伪列。

 

下面我们继续插入数据,方便做下面的实验:

 

如果我们需要取得前5条记录,我们会怎么做呢?我们看到前面的rownum是根据我们查出来的结果来进行赋值的,那么我们就明白了,也许可以这样:

select rownum,id from test where rownum <= 5 order by id;

  但很杯具的是,我们错了,看看结果:

为什么错呢?

  原因就是rownum会在我们查询出来结果还没排序前就进行编号。由于是这个原因,我们只要加个字查询就OK啦。

select rownum,id from (select * from test order by id) where rownum <= 5;

  我们看看结果:

现在没问题了,已经按照rownum来排序了,也就是实现了我们的要求,查出前5个。

 

不要高兴的太早,查前5个没问题,那中间的记录呢,第2到5个呢,或者大于5呢。我们来看看:

 select rownum,id from (select * from test order by id) where rownum >=1 and  rownum <= 4;

   看看结果:

  这个有数据,而且正常,很好。

但不要高兴,我们分页一般不会只要第一条开始吧,如果要中间呢?我们看看:

select rownum,id from (select * from test order by id) where rownum >=1 and  rownum <= 4;

  这次不要大跌眼睛了:

  杯具了吧。

为什么我们刚才拿到的>=1时会有呢,而现在>=2没有呢?

 

原因就是oracle在赋值rownum的时候会从1开始赋值,而当我们进行rownum >=1时,由于=1这个条件是成立的,所以它可以继续取下一条rownum,继续赋值到2,接连赋值下去。

而当我们用rownum >=2时,由于=2这个条件是不成立的,因为当取到第一条rownum=1时,会把它丢弃,而当取到下一条时,rownum还是为1,还是不满足,一直这样的循环,最后的结果就是没数据可查出了。

 

但我们分页确实要这样要进行,怎么办呢?

其实也简单,还是子查询的方式,不是直接用rownum那我们把子查询中的rownum命一个别名然后通过它来限定不就OK了。

我们看看:

select rn,id from (select rownum as rn,id from (select * from test order by id) ) where rn >=2 and rn <= 4;

  也许很多朋友看不明白是什么意思,我们先看看结果:

很正常,没问题吧。

但为什么这样就没问题呢?其实我们在上面的子查询中,直接把rownum用rn作为别名,它就被完全记录下来了,这里我们用它来作限定条件已经不关原来的rownum的事了。之所以要用两个子查询是因为第一个排序需要作为子查询才可以取到正确的rownum,才可以定义别名。

相信看到这,大家都应该知道怎么用oracle来实现分页啦。

 

这几天工作忙啊,BlogWriter暂时进展不大,努力啊。

 

  • 大小: 1.5 KB
  • 大小: 877 Bytes
  • 大小: 1.4 KB
  • 大小: 856 Bytes
  • 大小: 1.1 KB
  • 大小: 2 KB
  • 大小: 1 KB
  • 大小: 1.9 KB
  • 大小: 3.3 KB
  • 大小: 1.8 KB
  • 大小: 1.8 KB
  • 大小: 2.9 KB
2
1
分享到:
评论
7 楼 sjzcmlt 2016-07-04  
大神,供参考:
可在第一次查询的时候就限制最大数据
SELECT * FROM (SELECT ROWNUM r,t1.* From 表名称 t1 where rownum < M + N) t2
where t2.r >= M
6 楼 sjzcmlt 2016-07-04  
大神 ,膜拜
5 楼 cxshun 2011-06-20  
yznxing 写道
如果用这种方式来查询,那就被坑死了。。

用来理解rownum倒是没问题。


做个分页你要每次都全表扫描。太坑人了吧。

select rn,id from (select rownum as rn,id from (select * from test order by id) ) where rn >=2 and rn <= 4; 


再写仔细点,到底该如何完整的分页吧!


每次分页都要全表扫描是比较坑人,但貌似对于oracle来讲,似乎没其他比较好的方法,如果你有,不妨分享一下。大家也一起讨论。
4 楼 lsj8080 2011-06-17  
yznxing 请教一下,怎么写分页才是好的算法呢?
3 楼 yznxing 2011-06-17  
yznxing 写道
如果用这种方式来查询,那就被坑死了。。

用来理解rownum倒是没问题。


做个分页你要每次都全表扫描。太坑人了吧。

select rn,id from (select rownum as rn,id from (select * from test order by id) ) where rn >=2 and rn <= 4; 


再写仔细点,到底该如何完整的分页吧!



个人理解,不一定对。
2 楼 yznxing 2011-06-17  
如果用这种方式来查询,那就被坑死了。。

用来理解rownum倒是没问题。


做个分页你要每次都全表扫描。太坑人了吧。

select rn,id from (select rownum as rn,id from (select * from test order by id) ) where rn >=2 and rn <= 4; 


再写仔细点,到底该如何完整的分页吧!
1 楼 :倾诉 2011-06-17  
以前rownum总没去仔细看它,现在总算明白了,多谢lz啊.

相关推荐

    浅谈分页思路

    一个典型的真分页SQL查询会使用ROWNUM函数(针对Oracle数据库)或者LIMIT和OFFSET(针对MySQL数据库)来限制返回的结果集大小。例如,在Oracle数据库中,可以使用如下SQL: ```sql SELECT * FROM (SELECT ROWNUM AS...

    浅谈ORACLE数据库系统性能优化方案.pdf

    《浅谈ORACLE数据库系统性能优化方案》这篇文章主要探讨了如何提升Oracle数据库系统的性能,针对不同级别的优化进行了详细的阐述。Oracle数据库作为广泛应用的关系型数据库,其性能优化对于系统的整体效率至关重要。...

    Mybatis分页插件 - PageHelper.zip

    首先,PageHelper的前世今生可以从其诞生背景谈起。在Java Web开发中,Mybatis作为一款轻量级的持久层框架,被广泛应用。然而,Mybatis原生并不支持数据库层面的分页,开发者需要手动编写分页SQL,这无疑增加了代码...

    struts2- 2.3.15.3 spring3.2.4 mybatis-3.2.3 通用分页(不同数据库) 拦截器

    当我们谈到“通用分页”时,意味着系统需要能够在不同的数据库(如MySQL、Oracle、SQL Server等)上执行分页查询,而无需针对每种数据库写特定的SQL语句。这通常通过在MyBatis的Mapper XML文件中编写参数化的SQL实现...

    浅谈安装ORACLE时在Linux上设置内核参数的含义

    如果该值设置过小,可能会导致数据库启动失败。推荐设置为物理内存大小除以分页大小。分页大小可通过`getconf PAGE_SIZE`获取,然后计算SHMALL的合理值。例如,对于32GB内存且分页大小为4KB的系统,SHMALL应设为...

    浅谈mysql使用limit分页优化方案的实现

    与Oracle和MS SqlServer相比,mysql的分页方法简单的让人想哭。 –语法: SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset –举例: select * from table limit 5; --返回前5行 select * from ...

    浅谈MySQL和MariaDB区别(mariadb和mysql的性能比较)

    而在涉及排序的查询中,尽管MariaDB仍然比MySQL快,但在执行特定的分页优化查询时,其性能不如MySQL。 值得注意的是,数据库性能往往受到多种因素的影响,包括硬件配置、索引策略、SQL查询优化、并发处理能力以及...

    浅谈使用ADO.NET和ASP.NET访问SQL Server数据库.pdf

    由于提供的【部分内容】中大部分内容均为乱码,无法从中提取出有意义的IT知识点,但是根据标题“浅谈使用***和***访问SQL Server数据库.pdf”和【描述】中的重复标题,我们可以推断出本文档的主要内容。以下将围绕**...

    浅谈SQL Server Reporting Services会计报表解决方案.pdf

    SSRS支持多种数据源,如SQL Server、SQL Server Analysis Services、Oracle、ODBC和OLEDB等,它能整合这些数据并生成特殊的数据格式,以此满足不同用户的信息和数据需求。此外,SSRS还提供多种输出展现格式,包括...

    JSP实践之旅.exe

    JSP实践之旅 电子书版 &lt;br&gt; &lt;br&gt;序言--关于JSP实践之旅 简明介绍 JSP内幕 JSP官方白皮书 国内不谈java 基本语法介绍 2001年度Java最佳技术和产品 JSP入门介绍 三种Web开发主流技术的...

    java面试题

    **题目**: 谈一谈Hibernate的一级缓存、二级缓存和查询缓存。 **解答**: - **一级缓存**:也称为Session缓存,是默认启用的,用于缓存同一Session内获取的数据。 - **二级缓存**:用于跨Session缓存数据,需手动...

    收获不止SQL优化

    17.1.2 谈SQL编写顺序之流言蜚语 451 17.1.3 IN与EXISTS之争 455 17.1.4 总结探讨 457 17.2 误区背后的话题扩展 457 17.2.1 话题扩展之等价与否优先 457 17.2.2 话题扩展之颠覆误区观点 458 17.3 全书完,致...

Global site tag (gtag.js) - Google Analytics