rownum是oracle里面的一个伪列,它是为返回的数据集合做一个行标,从1开始; 可以这么使用: select * from (select col_1,col_2,rownum rn from tb) where rn<10; 下面是错误的使用: select * from tb where rownum >一个指定的数字 正确版: select * from ( select * from (select tb.*,rownum rn from tb) where rn < 14) where rn >10
-- 没有为什么! 在同一层查询中,rownum 只能是小于(或小于等于)才会出数据,用大于是不会出数据的, -- 要用大于的话,只能借用子查询: select col1, col2, col3 from (select col1, col2, col3, rownum as rn from tb_name ) tb where rn>10;
SQL> select * from ( 2 select * from ( 3 select ename,job,sal,rownum rn from emp 4 order by sal desc 5 )where rn>10) 6 /
ENAME JOB SAL RN ---------- --------- --------- ---------- FORD ANALYST 3000.00 13 MILLER CLERK 1300.00 14 ADAMS CLERK 1100.00 11 JAMES CLERK 950.00 12SQL> select * from ( 2 select * from ( 3 select ename,job,sal,rownum rn from emp 4 order by sal desc 5 )where rn<10 6 )where rn>5 7 /
ENAME JOB SAL RN ---------- --------- --------- ---------- KING PRESIDENT 5000.00 9 SCOTT ANALYST 3100.00 8 BLAKE MANAGER 2850.00 6 CLARK MANAGER 2450.00 7
因为rownum是在查询时才生成的,是动态的不是静态的。当数据库在执行这条语句时, select * from table_name where rownum>10先判断所查询的表中的第一条数据,其rownum=1;所以where为false,这时,该条数据没有被选入查询的结果集中,然后再去判断该表中的第二条数据,这时第二条数据的rownum不等于2,依然是rownum = 1;因为第一条数据没有被选入查询的结果集中,所以第二条数据的rownum依然等于1,(所以说rownum是动态生成的,不是静态的) 依次类推,每次判断where rownum>10时,所判断的数据行的rownum都是1,所以都选不中。也就是你说的没有数据。不知道,这样解释你清楚了没有。
可以这么使用:
select * from
(select col_1,col_2,rownum rn from tb)
where rn<10;
下面是错误的使用:
select * from tb
where rownum >一个指定的数字
正确版:
select * from (
select * from
(select tb.*,rownum rn from tb)
where rn < 14)
where rn >10
-- 要用大于的话,只能借用子查询:
select col1, col2, col3
from (select col1, col2, col3, rownum as rn
from tb_name ) tb
where rn>10;
SQL> select * from (
2 select * from (
3 select ename,job,sal,rownum rn from emp
4 order by sal desc
5 )where rn>10)
6 /
ENAME JOB SAL RN
---------- --------- --------- ----------
FORD ANALYST 3000.00 13
MILLER CLERK 1300.00 14
ADAMS CLERK 1100.00 11
JAMES CLERK 950.00 12SQL> select * from (
2 select * from (
3 select ename,job,sal,rownum rn from emp
4 order by sal desc
5 )where rn<10
6 )where rn>5
7 /
ENAME JOB SAL RN
---------- --------- --------- ----------
KING PRESIDENT 5000.00 9
SCOTT ANALYST 3100.00 8
BLAKE MANAGER 2850.00 6
CLARK MANAGER 2450.00 7
select * from table_name where rownum>10先判断所查询的表中的第一条数据,其rownum=1;所以where为false,这时,该条数据没有被选入查询的结果集中,然后再去判断该表中的第二条数据,这时第二条数据的rownum不等于2,依然是rownum = 1;因为第一条数据没有被选入查询的结果集中,所以第二条数据的rownum依然等于1,(所以说rownum是动态生成的,不是静态的)
依次类推,每次判断where rownum>10时,所判断的数据行的rownum都是1,所以都选不中。也就是你说的没有数据。不知道,这样解释你清楚了没有。