Oracle rownum原理和使用

对于查询返回的每一行,使用rownum伪列返回一个数字,表示oracle从表中选择行或将加入行的顺序。

选择的第一行rownum为1,第二行为2,以此类推。

可以使用rownum来限制由查询返回的行数,如下例子:

select * from test where rownum < 10;

如果一个order by子句和rownum在同一个查询,那么行会由order by子句中重新排序,看如下例子

select rownum, name, address, birthday
  from test
 where rownum < 5
 order by birthday;

我们发现rownum并不是顺序的,系统是按照记录插入的时候给记录排的号,解决这个问题 需要使用子查询

select rownum, name, address, birthday
  from (select name, address, birthday from test order by birthday)
 where rownum < 5

这样就成了按birthday排序,并且用rownum标出正确序号(由小到大)

前面我们使用rownum<10查询出来了9条数据,这次我们使用rownum>1来查询一下数据

select * from test where rownum > 1;

发现该查询无返回任何数据,所以我们无法使用rownum = n 或 rownum > n(n>1的自然数)来进行查询

原因是:

第一行读取被分配为1,rownum>1使得条件为假,接着读取第二行现在变为第一行,并还分配为1

rownum使得条件依然是假,所有行随后均未能满足该条件,所以没有行被返回。

如果非要rownum大于一个正整数来查询,还得需要子查询来实现

select num, name, address, birthday
  from (select rownum as num, name, address, birthday from test)
 where num > 5;

也可以使用between...and...

select num, name, address, birthday
  from (select rownum as num, name, address, birthday from test)
 where num between 5 and 10

SQL测试脚本:

create table test(
    name varchar2(100),
    address varchar2(100),
    birthday date
);
insert into test values(‘name1‘,‘address1‘,to_date(‘1990-04-10‘,‘yyyy-MM-dd‘));
insert into test values(‘name2‘,‘address2‘,to_date(‘1989-06-11‘,‘yyyy-MM-dd‘));
insert into test values(‘name3‘,‘address3‘,to_date(‘1991-08-23‘,‘yyyy-MM-dd‘));
insert into test values(‘name4‘,‘address4‘,to_date(‘1998-12-04‘,‘yyyy-MM-dd‘));
insert into test values(‘name5‘,‘address5‘,to_date(‘1985-07-16‘,‘yyyy-MM-dd‘));
insert into test values(‘name6‘,‘address6‘,to_date(‘1988-04-08‘,‘yyyy-MM-dd‘));
insert into test values(‘name7‘,‘address7‘,to_date(‘1992-08-26‘,‘yyyy-MM-dd‘));
insert into test values(‘name8‘,‘address8‘,to_date(‘1995-11-10‘,‘yyyy-MM-dd‘));
insert into test values(‘name9‘,‘address9‘,to_date(‘1988-03-28‘,‘yyyy-MM-dd‘));
insert into test values(‘name10‘,‘address10‘,to_date(‘1982-05-02‘,‘yyyy-MM-dd‘));
insert into test values(‘name11‘,‘address11‘,to_date(‘1991-10-19‘,‘yyyy-MM-dd‘));

参考文件

https://docs.oracle.com/cd/E18283_01/server.112/e17118/pseudocolumns009.htm

作者:itmyhome

时间: 2024-10-10 15:25:41

Oracle rownum原理和使用的相关文章

oracle: Rownum原理

Rownum原理: 1 Oracle executes your query. 执行查询操作 2 Oracle fetches the first row and calls it row number 1. 将第一行的row num置为1 3 Have we gotten past row number meets the criteria? If no, then Oracle discards the row, If yes, then Oracle return the row. 将得到

Oracle的rownum原理和使用(整理几个达人的帖子)

趁还没忘掉,赶快记录下来 Oracle的rownum原理和使用(整理几个达人的帖子) 整理和学习了一下网上高手关于rownum的帖子: 参考资料:  http://tech.ddvip.com/2008-10/122490439383296.html 和 http://tenn.javaeye.com/blog/99339 对于Oracle的rownum问题,很多资料都说不支持>,>=,=,between……and,只能用以上符号(<.& lt;=.!=),并非说用>,&g

Oracle中rownum原理介绍

rownum原理如下:1.执行查询操作2.将第一行的row num置为13.将得到的行的row num与条件相比较,如果不匹配,则抛弃行,如果匹配,则返回行4.oracle获取下一行,然后将rownum增15.返回第3步 从这个原理可以知道,select rownum,name from emp where rownum > 5;不返回行如何理解呢?rownum是一个序列,是oracle数据库从数据文件或缓冲区中读取数据的顺序.它取得第一条记录则rownum值为1,第二条为2,依次类推.因为你用

Oracle rownum影响执行计划

今天调优一条SQL语句,由于SQL比较复杂,用autotrace很难一眼看出哪里出了问题,直接上10046. SELECT AB.* FROM (SELECT A.*, rownum RN FROM (SELECT * from (SELECT DISTINCT (D.DEVICE_ID), F.FUNCTION_LOCATION_ID from GG_device D, GG_CLASSIFY_CARD C, GG_function_location F, GG_fl_device L, GG

[Oracle] ROWNUM和分页

rownum是oracle的一个伪劣,它的顺序根据从表中获取记录的顺序递增,这里要注意的是:由于记录在表中是无序存放的,因此你无法通过简单的rownum和order by的组合获得类似TOP N的结果. 我们的测试数据如下: select * from test; ID NAME ---------- -------------------- 1 A 3 C 4 C 8 C 10 D 2 B 5 C 7 C 6 C 9 D 通过rownum<=5可以获得前5行数据: select * from

利用oracle rownum让表排序字段值连续

利用oracle rownum让表排序字段值连续 1.需求说明 表(eval_index)中有字段如下: 表字段 描述 说明 ID 主键 GROUP_ID 分组编号 SORT_NUM 排序序号 按照分值编号并排序:1.2.- 由于删除或其他操作,导致sort_num序号不连续:需要不改变原来的排序,保持其编号连续. 2.利用rownum功能实现 update eval_index a seta.sort_num = ( select b.rn from (select rownum rn ,id

Oracle的rownum原理和使用

整理和学习了一下网上高手关于rownum的帖子: 参考资料:  http://tech.ddvip.com/2008-10/122490439383296.html 和 http://tenn.javaeye.com/blog/99339 对于Oracle的rownum问题,很多资料都说不支持>,>=,=,between……and,只能用以上符号(<.& lt;=.!=),并非说用>,>=,=,between……and 时会提示SQL语法错误,而是经常是查不出一条记录

oracle rownum 注意事项

1.使用rownum一定要包含第一条记录,如果不包含第一条记录,则不会返回结果.因为rownum是伪列,是有结果集之后再加上的列.而且是从1开始排列的. 2.在使用rownum时,只有东order by的字段是主键时,查询结果才会先排序后再计算rownum,反之,如果排序字段不是主键,则会出现先有rownum,在对结果集进行排序的情况. 3.排序分页是注意,oracle对排序结果及做了优化,如果排序字段存在多条相同记录时,可能在多页中出现相同的记录:解决方法是排序时,除了使用原本的排序字段,在加

Oracle事务原理探究2--读书笔记五

续上篇... 3.  数据块访问与undo 任何时候当会话查看一个数据块的时候,都需要保证看到的是适当的数据版本.从外部观点来看,这意味着会话不应该看到任何未提交的数据,或许还不应该看到查询开始后修改并提交的数据(取决于事务的隔离级别),这称为数据的读一致性版本. 下面我们来谈谈oracle怎么实现读一致性版本的: 3.1 设置场景 我们会创建一张表,里面插入3条数据,然后开几个会话对其进行操作 3.1.1 连接oracle,以任何一个用户登录即可,初始化一些格式 execute dbms_ra