首页 > 数据库 > Oracle > Oracle中的伪列详解
Rowid:数据库中的每行都有一个行地址,Rowid真列返回该行地址。可以或许应用Rowid值来定位表中的一行。但凡状况下,Rowid值可以或许唯一地标识数据库中的一行。
Rowid真列有以下重要用途:
1)能以最快的圆法会睹表中的一行;
2)能隐现表的行是如何存储的。
3)可以或许做为表中行的唯一标识。
如:SQL> select rowid,ename from
emp;
关于rownum来道它是oracle体系顺序分派为从查询返回的行的编号,返回的第一行分派的是1,第两行是2,依此类推,阿谁真字段可以或许用于限制查询返回的总行数,并且rownum没有能以任何表的称呼做为前缀。
举例道明:
比方表:student(学死)表,表布局为:
ID
name VARCHAR2(10)
create table student (ID char(6), name VARCHAR2(100));
insert into sale values("200001",‘张一’);
insert into sale values("200002",‘王两’);
insert into sale values("200003",‘李三’);
insert into sale values("200004",‘赵四’);
commit;
(1) rownum 关于即是某值的查询条件
假设期看找到学死表中第一条学死的疑息,可以或许应用rownum=1做为条件。然则念找到学死表中第两条学死的疑息,应用rownum=2结局查没有到数据。果为rownum都是从1进手下手,然则1以上的自然数在rownum做即是判定是时以为都是false条件,所以没法查到rownum
= n(n>1的自然数)。
SQL> select rownum,id,name from student where
rownum=1;(可以或许用在限制返回纪录条数的中心,保证没有出错,如:隐式游标)
SQL> select rownum,id,name from student where
rownum=1;
---------- ------
---------------------------------------------------
SQL> select rownum,id,name from student where rownum
=2;
---------- ------
---------------------------------------------------
(2)rownum关于大于某值的查询条件(应用子查询处置奖奖)
SQL> select rownum,id,name from student where rownum
>2;
ROWNUM
ID
---------- ------
---------------------------------------------------
那如何才气找到第两行以后的纪录呀。可以或许应用以下的子查询举措来处置奖奖。注意子查询中的rownum必需要有别名,否则借是没有会查出纪录来,那是果为rownum没有是某个表的列,假设没有起别名的话,没法知道rownum是子查询的列借是主查询的列。
SQL>select * from(select rownum no ,id,name from
student) where no>2;
---------- ------
---------------------------------------------------
SQL> select * from(select rownum,id,name from
student)where rownum>2;
---------- ------
---------------------------------------------------
(3)rownum关于小于某值的查询条件
假设念找到第三条纪录之前的纪录,当应用rownum<3是能获得两条纪录的。隐然rownum关于rownum
SQL> select rownum,id,name from student where rownum
<3;
---------- ------
---------------------------------------------------
综上几种状况,可能有时间需要查询rownum在某区间的数据,那如何办呀?从上可以或许看出rownum对小于某值的查询条件是工钱true的,rownum关于大于某值的查询条件直接以为是false的,然则可以或许直接的让它转为以为是true的。那便必需应用子查询。比方要查询rownum在第两行到第三行之间的数据,搜罗第两行战第三行数据,那么我们只能写以下语句,先让它返回小于即是三的纪录行,然后在主查询中判定新的rownum的别名列大于即是两的纪录行。然则那样的操做会在大数据散中影响速度。
SQL> select * from (select rownum no,id,name from
student where rownum<=3 ) where no
>=2;
---------- ------
---------------------------------------------------
(4)rownum战排序
Oracle中的rownum的是在取数据的时间产死的序号,所以念对指定排序的数据往指定的rowmun行数据便必需注意了。
SQL> select rownum ,id,name from student order by
name;
---------- ------
---------------------------------------------------
可以或许看出,rownum并没有是根据name列来死成的序号,是根据结局停止编号,而order是在查询结局出来后才停止的排序,在rownum以后,所以num随着order完成后收作了位置改变。rowid体系是根据纪录插进时的顺序给的。为了处置奖奖阿谁成绩,必需应用子查询
SQL> select rownum ,id,name from (select * from
student order by name);
---------- ------
---------------------------------------------------