要想理解ORACLE数据库中 rownum的条件语句用法问题,那么就必须要必须先理解rownum的意义。
那么什么是rownum呢?
rownum 是 伪列的意思,它是 Oracle数据库对其从数据文件或缓冲区读取到的数据的结果集分配的一个伪序列。它总是从1开始的。
有了这个基本的概念,我们再根据使用时的一些现象来进一步分析和理解rownum的概念的具体含义。
现象一:
where rownum != 10 这个条件的结果是只会出现第1~9行,第10行不出现可以理解,但第10行后的数据也不会出现。
原因:
前面的第1~9行没有问题,当读到第10行时,系统给这一行数据分配的rownum是10,而rownum=10并不满足rownum !=10这个条件,于是这一行数据被舍弃了,结果集中目前还是只有9行数据,所以当读到第11行数据时,系统分配给这一行数据的rownum依然还是10,所以仍然不满足条件,第11行数据又被舍弃…后面会一直重复这个过程,直到最后一行的数据被读取后也由于rownum=10被舍弃。所以最后的结果集中就只有1-9行的数据。
现象二:
where rownum > 1 一条记录都不显示 但 where rownum >0 或 where rownum >= 1 显示所有记录
原因:
(1)where rownum > 1 :由于系统给读取的数据行分配rownum行号时,总是从1开始的,所以第一行开始读取的每一行数据都会因为分配给的rownum为1而被舍弃,所以一条记录都没有;
(2)where rownum >0 或 where rownum >= 1:同理,由于第一行开始读取的每一行数据分配的rownum都会满足条件,所以最后的结果集中就包含了所有的记录。
现象三:
where rownum between 0 and 10 和 between 1 and 10 都会显示1-10行 但 where rownum between 2 and 10就一条记录都没有
原因:
同样是由于系统给读取的数据行分配rownum行号时,总是从1开始的。
所以我们可以发现:rownum 的条件语句中至少需要包含 rownum=1 。
值得注意的是:
(1)rownum不能以任何基表的名称作为前缀。
(2)这里讲的都是rownum 的条件语句的问题,并不是嵌套查询中rownum已经分配完成后的再次查询时的条件语句。
例如:分页查询中 select * from (select a1.*,rownum rn from(select * from emp order by empno) a1 where rownum <=10) where rn >=6; 语句中的 rn的条件语句不存在上面的问题。