Oracle分页

1. rownum是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数。
2. rownum不能以任何基表的名称作为前缀。

 

先好好理解 rownum 的意义。因为ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。简单的说 rownum 是对符合条件结果的序列号。它总是从1开始排起的。 所以你选出的结果不可能没有1,而有其他大于1的值。



按scott.emp为例:
按工资排序,并且以rownum作为序号
是这样写吗?

  1. SQL>  select  rownum,emp.empno,emp.sal  from  emp  order   by  sal;  
  2.   
  3.     ROWNUM      EMPNO        SAL  
  4. ---------- ---------- ----------   
  5.          1       7369        800  
  6.         12       7900        950  
  7.         11       7876       1100  
  8.          3       7521       1250  
  9.          5       7654       1250  
  10.         14       7934       1300  
  11.         10       7844       1500  
  12.          2       7499       1600  
  13.          7       7782       2450  
  14.          6       7698       2850  
  15.          4       7566       2975  
  16.   
  17.     ROWNUM      EMPNO        SAL  
  18. ---------- ---------- ----------   
  19.          8       7788       3000  
  20.         13       7902       3000  
  21.          9       7839       5000  
SQL> select rownum,emp.empno,emp.sal from emp order by sal;

    ROWNUM      EMPNO        SAL
---------- ---------- ----------
         1       7369        800
        12       7900        950
        11       7876       1100
         3       7521       1250
         5       7654       1250
        14       7934       1300
        10       7844       1500
         2       7499       1600
         7       7782       2450
         6       7698       2850
         4       7566       2975

    ROWNUM      EMPNO        SAL
---------- ---------- ----------
         8       7788       3000
        13       7902       3000
         9       7839       5000



让您失望了,rownum还是按自己的顺序。
应该这样写:


  1. SQL>  select  rownum,e.empno,e.sal  from  ( select  *  from  emp  order   by  sal);  
  2.   
  3.     ROWNUM      EMPNO        SAL  
  4. ---------- ---------- ----------   
  5.          1       7369        800  
  6.          2       7900        950  
  7.          3       7876       1100  
  8.          4       7521       1250  
  9.          5       7654       1250  
  10.          6       7934       1300  
  11.          7       7844       1500  
  12.          8       7499       1600  
  13.          9       7782       2450  
  14.         10       7698       2850  
  15.         11       7566       2975  
  16.   
  17.     ROWNUM      EMPNO        SAL  
  18. ---------- ---------- ----------   
  19.         12       7788       3000  
  20.         13       7902       3000  
  21.         14       7839       5000  
  22.   
  23. 已选择14行。  
SQL> select rownum,e.empno,e.sal from (select * from emp order by sal) e;

    ROWNUM      EMPNO        SAL
---------- ---------- ----------
         1       7369        800
         2       7900        950
         3       7876       1100
         4       7521       1250
         5       7654       1250
         6       7934       1300
         7       7844       1500
         8       7499       1600
         9       7782       2450
        10       7698       2850
        11       7566       2975

    ROWNUM      EMPNO        SAL
---------- ---------- ----------
        12       7788       3000
        13       7902       3000
        14       7839       5000

已选择14行。




那么还想分页呢?再加一层子循环:


  1. select  rn,empno,sal  from   
  2. (select  rownum rn,t.*  from    
  3. (select  *  from  emp  order   by  sal,empno) t)  
  4. where  rn  between  2  and  7;  
  5.   
  6.       
  7.            RN      EMPNO        SAL    
  8.     ---------- ---------- ----------     
  9.             2       7900        950    
  10.             3       7876       1100    
  11.             4       7521       1250    
  12.             5       7654       1250    
  13.             6       7934       1300    
  14.             7       7844       1500    
  15.        
  16.    已选择6行。   

你可能感兴趣的:(oracle,sql)