缘由一 oracle默认为每一个表生成rowmun,rowid字段,这些字段咱们称之为伪列oracle
1 建立测试表测试
CREATE TABLE TEST( ID NUMBER, NAME VARCHAR2(20) )
2 插入测试数据spa
INSERT INTO TEST VALUES (1,'张三'); INSERT INTO TEST VALUES (2,'李四'); INSERT INTO TEST VALUES (3,'王五'); INSERT INTO TEST VALUES (4,'赵六'); INSERT INTO TEST VALUES (5,'郑七'); INSERT INTO TEST VALUES (6,'胡八'); INSERT INTO TEST VALUES (7,'刘九');
3 查看表字段,证明自带的字段 code
select rowid,rownum,id,name from TEST;
4 rowid通常用不到,Oracle内部用来存储行的物理位置,和分页相关的就是rownum,也就是行号blog
二class
1 查询小于5的行,查询出四条结果test
select rowid,rownum,id,name from test where rownum <5;
2 查询大于2小于5的行bfc
select rownum,id,name from test where rownum>2 and rownum <5;
发现什么也没查出来,什么缘由呢?,select
rownum有以下特色:循环
1 ROWNUM只适用于小于或小于等于,若是进行等于判断,那么只能等于1;
2 ROWNUM是oracle系统顺序分配的行的编号,返回的第一行分配的是1,第二行是2,依此类推;
3 ROWNUM老是从1开始
4 第一条数据行号为1,不符合>2的条件,则第一行被去掉,以前的第二行变为新的第一行,如此下去,一直到最后一行,条件始终无法知足,因此就一条数据也查不出来。
3 正确写法:由于>用不了,将行号用内层查询查询出来当作一个结果集,在外层用内层结果集进行比较便可
select rownum,id,name from ( select rownum rn, u.* from test u where rownum<5) un where un.rn>2
4 若是进行分页的话,好比每页三行,要查询第二页,则至关于查4,5,6条,起始行4= (页码-1)*每页长度+1,结束行6=页码*每页长度
select rownum,id,name from ( select rownum rn , t.* from test t where rownum <=6) n where n.rn>=4
5 一样的能够把4中查询改成最多见的三层结构
select rownum,id,name from ( select rownum rn, n.* from ( select * from test --最内层循环该怎么写怎么写 ) n where rownum <=6 --小于限制写在第二层 ) where rn>=4