ITPub博客

首页 > 数据库 > Oracle > Oracle中rownum的使用

Oracle中rownum的使用

Oracle 作者:likoke 时间:2013-12-08 13:31:11 0 删除 编辑

比来正在给菜鸟收集做项目实行,要用到Oracle下面清理一下
正在使用Oracle中使用Rownum,会有些直解,现清理下网友们的文章,期视能有所协助,呵呵

对 Oracle 的 rownum 成就,很多资料皆说没有支持>,>=,=,between...and,只能用以上标识表记标帜(<、<=、!=),并非说用>,>=,=,between..and 时会提醒SQL语法误差,而是经常是查没有出一笔记录来,借会泛起恍如是莫名其妙的成果来,其实您只要相识好了这个 rownum 真列的意义便没有应当感到诧异,一样是真列,rownum 与 rowid 可有些纷歧样,下面以例子说明

假定某个表 t1(c1) 有 20 笔记录

若是用 select rownum,c1 from t1 where rownum < 10, 只若是用小于号,查出来的成果很容易天与一般相识正在概念上能达成一致,应当没有会有任何疑问的。

可若是用 select rownum,c1 from t1 where rownum > 10 (若是写下如许的查询语句,这时分正在您的思维中应当是想得到表中后面10笔记录),你便会发现,隐现出来的成果要让您绝视了,年夜概您借会思疑是没有谁删了一些记录,然后检察记录数,仍然是 20 条啊?那成就是出正在哪呢?

先好好相识 rownum 的意义吧。因为ROWNUM是对成果集加的一个真列,即先查到成果集以后再加上来的一个列 (夸年夜:先要有成果集)。简单的说 rownum 是对合适条件成果的序列号。它总是从1开初排起的。所以你选出的成果没有行能没有1,而有其他年夜于1的值。所以您没办法希冀得到下面的成果集:

11 aaaaaaaa
12 bbbbbbb
13 ccccccc
.................

rownum >10 没有记录,因为第一条没有对劲来掉的话,第两条的ROWNUM又成了1,所以永远没有对劲条件的记录。年夜概可以或许如许相识:

ROWNUM是一个序列,是oracle数据库从数据文件或缓冲区中读与数据的次第。它得到第一笔记录则rownum值为1,第两条为2,顺次类推。若是你用>,>=,=,between...and这些条件,因为从缓冲区或数据文件中得到的第一笔记录的rownum为1,则被删除,接着与下条,然则它的rownum借是1,又被删除,顺次类推,便没有了数据。

有了以上从没有同方面创立起来的对 rownum 的概念,那我们可以或许来熟悉使用 rownum 的几种现像

1. select rownum,c1 from t1 where rownum != 10 为何是返回前9条数据呢?它与 select rownum,c1 from tablename where rownum < 10 返回的成果集是一样的呢?
因为是正在查询到成果集后,隐现完第 9 笔记录后,以后的记录也皆是 != 10,年夜概 >=10,所以只隐现前面9笔记录。也可以或许如许相识,rownum 为9后的记录的 rownum为10,因条件为 !=10,所以来掉,其跋文录补上,rownum又是10,也来掉,若是下来也便只会隐现前面9笔记录了

2. 为何 rownum >1 时查没有到一笔记录,而 rownum >0 或 rownum >=1 却总隐现所以的记录
因为 rownum 是正在查询到的成果集后加上来的,它总是从1开初

3. 为何 between 1 and 10 年夜概 between 0 and 10 能查到成果,而用 between 2 and 10 却得没有到成果
本因同上一样,因为 rownum 总是从 1 开初

从上可以或许看出,任什么时候分想把 rownum = 1 这笔记录拾弃是没有对的,它正在成果汇合是没有行或缺的,少了rownum=1 便像蜃楼海市一般没有能存正在,所以你的 rownum 条件要包露到 1 

但若是就是想要用 rownum > 10 这种条件的话话便要用嵌套语句,把 rownum 先死成,然后对他进行查询。
select * 
from (selet rownum as rn,t1.* from a where ...)
where rn >10

一般代码中对成果集进行分页就是这么干的。

另中:rowid 与 rownum 虽皆被称为真列,但它们的存正在方法是纷歧样的,rowid 可以或许说是物理存正在的,示意记录正在表空间中的唯一名置ID,正在DB中唯一。只要记录没被挪动转移过,rowid是没有变的。rowid 相对表来说又像表中的一般列,所以以 rowid 为条件便没有会有 rownum那些情况产死。
另中借要留神:rownum没有能以任何基表的名称做为前缀。

oracle的rownum是正在提与记录便曾死成,它先于排序操做,所以必须使用子查询先排序。

ROWNUM值的分拨是正在查询的谓词理睬以后,任何排序战散合之行进行的。

施行次第:

FROM/WHERE子句先被施行.
根据FROM/WHERE子句输出的行, ROWNUM被分拨给他们并自增添.
SELECT 被使用.
GROUP BY 被使用.
HAVING is 被使用.
ORDER BY 被使用.

分页可以或许如许写


select * from

(select a.*,rownum row_num from

(select * from mytable t order by t.id desc) a

) b where b.row_num between 1 and 10


ROWNUM对性能的影响
ROWNUM可以或许避免oracle正在磁盘前途行排序。rownum无法避免齐表扫描的产死,然则它可以或许避免对全部表数据的排序操做,正在指定了rownum后,排序操做正在内存中可以或许沉松完成。
农人身边综合网>

<!-- 正文结束 -->

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22908088/viewspace-1117576/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2009-11-21