首页 > Linux操作系统 > Linux操作系统 > Oracle的rownum
Oracle的rownum是数据库中的一个伪列,它是依据查询的过程而临时产生的,并不是已在数据库中存在的数据列。是oracle数据库从数据文件或数据缓冲区中读取数据的顺序。在查询语句的执行中,数据库先查询出结果集,再根据结果集形成对应的rownum,而且rownum始终是动态的从1开始进行记录的。rownum不能以任何基表为前缀。对于oracle数据库只能使用符号(<,<=,!=)而不能使用(>,>=,=,between..and)举例说明:
SQL> select rownum,t.* from t where rownum<10;
ROWNUM ID NAME
---------- ---------- ------------------------------
1 1 a
2 2 a
3 3 a
4 4 a
5 5 a
6 6 a
7 7 a
8 8 a
9 9 a
9 rows selected.
查询的结果与实际一致。
SQL> select rownum,t.* from t where rownum>20;
no rows selected。
查询的结果出乎意料。对照上述概念可以理解为rownum是在查到结果集后再加上去的列,是对符合条件结果的序列号,总是从1开始排起得。所以选出的结果不可能没有1,而又其他大于1的值。对于上述rownum>20没有记录,因为第一条不满足的话,第二条的rownum又变成了1,所以永远没有满足的记录。
看几种具体的情况:
1.SQL> select rownum,t.* from t where rownum!=10;
ROWNUM ID NAME
---------- ---------- ------------------------------
1 1 a
2 2 a
3 3 a
4 4 a
5 5 a
6 6 a
7 7 a
8 8 a
9 9 a
9 rows selected.
与select rownum,t.* from t where rownum<10返回的结果集一样,因为是在查询到结果集后,显示完第9条记录后,之后的记录也都是!=10或者>=10,所以只显示前面9条,也可以理解为rownum为9后的记录的rownum为10,因为条件为!=10,所以去掉,其后记录补上,rownum又是10,也去掉,如果下去也就只会显示前面9条记录了。
2.SQL> select rownum,t.* from t where rownum>1;
no rows selected。
而select rownum,t.* from t where rownum>0或select rownum,t.* from t where rownum>=1总是显示所有记录。因为rownum是在查询到结果集后加是去的,总是从1开始的。
3.SQL> select rownum,t.* from t where rownum between 1 and 10;
ROWNUM ID NAME
---------- ---------- ------------------------------
1 1 a
2 2 a
3 3 a
4 4 a
5 5 a
6 6 a
7 7 a
8 8 a
9 9 a
10 10 a
10 rows selected.
而SQL> select rownum,t.* from t where rownum between 2 and 10无结果集返回来,因为rownum是在查询到结果集后加上去的,总是从1开始的。在任何时候rownum都是从1开始的,它在结果集中不可或缺,少了它结果集就不存在。所以在查询的时候rownum条件要包含1.
但如果就要查询rownum>10这种条件的结果集的话,可以使用oracle的嵌套语句把rownum先生成后再进行查询,如:
SQL> select * from (select rownum as rn,t.* from t where rownum<30) where rn>10;
RN ID NAME
---------- ---------- ------------------------------
11 11 a
12 12 a
13 13 a
14 14 a
15 15 a
16 16 a
17 17 a
18 18 a
19 19 a
20 20 a
21 21 a
RN ID NAME
---------- ---------- ------------------------------
22 22 a
23 23 a
24 24 a
25 25 a
26 26 a
27 27 a
28 28 a
29 29 a
19 rows selected.
oracle也是使用上述嵌套语句进行数据分页查询的。
oracle中还有rowid与rownum一样都成为伪列,它们的区别是rowid是物理存在的,标记一条数据记录在表空间中唯一的位置ID,在数据库中唯一,只要数据未移动,rowid是不变的,相对表来说像表中的一列。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/20523441/viewspace-759853/ ,如需转载,请注明出处,否则将追究法律责任。