oracle的rownum伪列的一些问题

练习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的理解 暂时就写这么多了 要是遇到什么问题了 官方文档果然是最好的帮手

你可能感兴趣的:(oracle,职场,rownum,休闲)