练习oracle的Top-N查询的时候,我们要用到rownum这个伪列
我们就来了解一下rownum这个伪列
注意观察下面这几个语句
SQL> select ename from emp where rownum =1;
ENAME
----------
SMITH
SQL> select ename from emp where rownum =2;
no rows selected
SQL> select ename from emp where rownum <=2;
ENAME
----------
SMITH
ALLEN
SQL> select ename from emp where rownum between 2 and 4;
no rows selected
好了,就有些奇怪了,为什么有些有返回,有些没有返回呢
我们查看一下所有的rownum
SQL> select ename,rownum from emp;
ENAME ROWNUM
---------- ----------
SMITH 1
ALLEN 2
WARD 3
JONES 4
MARTIN 5
BLAKE 6
CLARK 7
SCOTT 8
KING 9
TURNER 10
ADAMS 11
ENAME ROWNUM
---------- ----------
JAMES 12
FORD 13
MILLER 14
这个查询产生的rownum列 按照常理说我们应该是可以自由使用rownum对其进行操作啊 可是为什么不行呢?这个时候我们就得求助官方文档了
----------------------------------------------------------------------------------------------
Conditions testing for
ROWNUM
values greater than a positive integer are always false. For example, this query returns no rows:
SELECT * FROM employees WHERE ROWNUM > 1;
The first row fetched is assigned a
ROWNUM
of 1 and makes the condition false. The second row to be fetched is now the first row and is also assigned a
ROWNUM
of 1 and makes the condition false. All rows subsequently fail to satisfy the condition, so no rows are returned.
----------------------------------------------------------------------------------------------
这里讲得很清楚 如果你给rownum赋值一个特定的数值的话是会出错的,出错的原因是这个伪列的第一行的返回就已经是假了,为这个查询分配的第一行的rownum为1 而后面的条件是让其大于1 整个查询语句已经为假了,自然不会返回任何结果
所以理解到这一点后就很好办了
那么这个语句where后是真 返回第一行
SQL> select ename from emp where rownum =1;
ENAME
----------
SMITH
而这个语句where后面rownum的第一行(就是1)和2不等,为假,整个语句就返回假了 所以你看不到任何返回值
SQL> select ename from emp where rownum =2;
no rows selected
也就是说这个样子的rownum你是可以<=某个数值的
也许你要问,我就要查询>或者之间的rownum列怎么办?
知道rownum是个伪列嘛!那么我们还有嵌入式视图,当成一个表,然后我们再查询这个表,那么就不受限制了
例如:
SQL> select * from (select ename,rownum r from emp) where r>10;
ENAME R
---------- ----------
ADAMS 11
JAMES 12
FORD 13
MILLER 14
OK! rownum的理解 暂时就写这么多了 要是遇到什么问题了 官方文档果然是最好的帮手
转载于:https://blog.51cto.com/lcrash/251458