ORACLE中ROWNUM的说明 oracle中rownum的用法
对于rownum来说它是Oracle系统顺序分配为查询返回的行的编号,返回的第一行分配的是1,第二行是2,以此类推,这个伪字段可以用于限制查询返回的总行数,而且rownum不能以任何表的名称作为前缀这里仍然以emp表为例:SQL> select rownum,emp.* from emp order byempno; ROWNUM EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO---------- ---------- ---------- --------- -------------------- ---------- ---------- ---------- 1 7369 SMITH CLERK 7902 1980/12/17 800 20 2 7499 ALLEN SALESMAN 76981981/02/20 1600 300 30 3 7521 WARD SALESMAN 76981981/02/22 1250 500 30 4 7566 JONES MANAGER 78391981/04/02 2975 20 5 7654 MARTIN SALESMAN 76981981/09/28 1250 1400 30 6 7698 BLAKE MANAGER 78391981/05/01 2850 30 7 7782 CLARK MANAGER 78391981/06/09 2450 10 8 7788 SCOTT ANALYST 75661987/04/19 3500 20 9 7839 KING PRESIDENT 1981/11/17 5000 10 10 7844 TURNER SALESMAN 7698 1981/09/08 1500 0 30 11 7876 ADAMS CLERK 77881987/05/23 1100 20 12 7900 JAMES CLERK 76981981/12/03 950 30 13 7902 FORD ANALYST 7566 1981/12/03 3000 20 14 7934 MILLER CLERK 77821982/01/23 1300 10已选择14行。
1、rownum对等于某值的查询条件如果希望找到员工中第一条员工的信息,可以使用rownum=1的查询条件。但是如果想找到学生表中第二条员工的信息,使用rownum=2是查询不到数据的。因为rownum都是从1开始的,但是1以上的自然数在rownum做等值判断时都认为为false条件,所以无法查询到rownum=n(n>1的自然数)SQL> select rownum,emp.* from emp whererownum=1 order by empno; ROWNUM EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO---------- ---------- ---------- --------- -------------------- ---------- ---------- ---------- 1 7369 SMITH CLERK 7902 1980/12/17 800 20
SQL> select rownum,emp.* from emp whererownum=2 order by e--mpno;未选定行SQL>
2、rownum对于大于某值的查询条件如果想找到从第二行记录以后的记录,使用rownum>2是查询不出记录的,原因是由于rownum是一个总是从1开始的伪列,Oracle认为rownum>n(n>1的自然数)这种条件依旧不成立,所以查询不到记录SQL> select rownum,emp.* from emp whererownum>2 order by empno;未选定行SQL>那么该如何查询到第二行以后的记录呢?可以通过子查询的方式来实现SQL> select rownum,a.* from (select rownumno,emp.* from emp) a where no>2 order byempno; ROWNUM NO EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO---------- ---------- ---------- ---------- ------------------- ---------- ---------- ---------- ---------- 1 3 7521 WARD SALESMAN 7698 1981/02/22 1250 500 30 2 4 7566 JONES MANAGER 7839 1981/04/02 2975 20 3 5 7654 MARTIN SALESMAN 7698 1981/09/28 1250 1400 30 4 6 7698 BLAKE MANAGER 7839 1981/05/01 2850 30 5 7 7782 CLARK MANAGER 7839 1981/06/09 2450 10 6 8 7788 SCOTT ANALYST 7566 1987/04/19 3500 20 7 9 7839 KING PRESIDENT 1981/11/17 5000 10 8 10 7844TURNER SALESMAN 7698 1981/09/08 1500 0 30 9 11 7876 ADAMS CLERK 7788 1987/05/23 1100 20 10 12 7900 JAMES CLERK 7698 1981/12/03 950 30 11 13 7902 FORD ANALYST 75661981/12/03 3000 20 12 14 7934 MILLER CLERK 7782 1982/01/23 1300 10已选择12行。
3、rownum对于小于某值的查询条件如何想找到第三条记录以前的记录,当使用rownum<3的时候是只能得到两条记录的,然而rownum对于rownum<n(n>1的自然数)的条件认为是成立的,所以可以找到记录:SQL> select rownum,emp.* from emp whererownum<3 order by empno; ROWNUM EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO---------- ---------- ---------- --------- -------------------- ---------- ---------- ---------- 1 7369 SMITH CLERK 7902 1980/12/17 800 20 2 7499 ALLEN SALESMAN 76981981/02/20 1600 300 30已选择2行。综上的几种情况,可能有时候需要查询rownum所在的某个区间内的数据,从上面可以看出rownum对于小于某值的查询条件是认为true的,rownum对于大于某值的查询条件是直接认为false的,但是可以通过间接的方式将其转换为true状态。那就必须使用使用子查询了。例如要查询rownum在第二行到第三行之间的记录,包括第二行和第三行数据,那么我们只能写下面的语句:SQL> select * from (select rownum no,emp.* fromemp where rownum <= 3 order by empno) a where no>= 2; NO EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO---------- ---------- ---------- --------- -------------------- ---------- ---------- ---------- 2 7499 ALLEN SALESMAN 76981981/02/20 1600 300 30 3 7521 WARD SALESMAN 76981981/02/22 1250 500 30已选择2行。SQL>4、rownum和排序Oracle中的rownum是在获取数据的时候产生的序号,所以相对指定排序的数据去指定rownum行数据就必须注意了SQL> select rownum,emp.* from emp order byename; ROWNUM EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO---------- ---------- ---------- --------- -------------------- ---------- ---------- ---------- 11 7876 ADAMS CLERK 77881987/05/23 1100 20 2 7499 ALLEN SALESMAN 76981981/02/20 1600 300 30 6 7698 BLAKE MANAGER 78391981/05/01 2850 30 7 7782 CLARK MANAGER 78391981/06/09 2450 10 13 7902 FORD ANALYST 7566 1981/12/03 3000 20 12 7900 JAMES CLERK 76981981/12/03 950 30 4 7566 JONES MANAGER 78391981/04/02 2975 20 9 7839 KING PRESIDENT 1981/11/17 5000 10 5 7654 MARTIN SALESMAN 76981981/09/28 1250 1400 30 14 7934 MILLER CLERK 77821982/01/23 1300 10 8 7788 SCOTT ANALYST 75661987/04/19 3500 20 1 7369 SMITH CLERK 7902 1980/12/17 800 20 10 7844 TURNER SALESMAN 7698 1981/09/08 1500 0 30 3 7521 WARD SALESMAN 76981981/02/22 1250 500 30已选择14行。可以看出,rownum并不是按照ename列来生产的序号,而是按照系统插入记录的先后顺序给记录编的号,rowid也是顺序分配的,为了解决这个问题,必须使用子查询:SQL> select rownum,a.* from (select * from emporder by ename) a; ROWNUM EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO---------- ---------- ---------- --------- -------------------- ---------- ---------- ---------- 1 7876 ADAMS CLERK 7788 1987/05/23 1100 20 2 7499 ALLEN SALESMAN 76981981/02/20 1600 300 30 3 7698 BLAKE MANAGER 78391981/05/01 2850 30 4 7782 CLARK MANAGER 78391981/06/09 2450 10 5 7902 FORD ANALYST 75661981/12/03 3000 20 6 7900 JAMES CLERK 7698 1981/12/03 950 30 7 7566 JONES MANAGER 78391981/04/02 2975 20 8 7839 KING PRESIDENT 1981/11/17 5000 10 9 7654 MARTIN SALESMAN 76981981/09/28 1250 1400 30 10 7934 MILLER CLERK 77821982/01/23 1300 10 11 7788 SCOTT ANALYST 7566 1987/04/19 3500 20 12 7369 SMITH CLERK 79021980/12/17 800 20 13 7844 TURNER SALESMAN 7698 1981/09/08 1500 0 30 14 7521 WARD SALESMAN 7698 1981/02/22 1250 500 30已选择14行。这样就成了按照name排序,并且使用rownum标出了需要的序号序列(由小到大)
更多阅读
Excel中sumif和sumifs函数进行条件求和的用法 sumifs多个条件求和
Excel中sumif和sumifs函数进行条件求和的用法——简介sumif和sumifs函数是Excel2007版本以后新增的函数,功能十分强大,实用性很强,本文介绍下Excel中通过用sumif和sumifs函数的条件求和应用,并对函数进行解释,希望大家能够掌握使用技巧。
matlab中fprintf和disp的用法 matlab disp fprintf
matlab中fprintf 和disp的用法>> disp('pi=',pi)??? Error using==> dispToo many inputarguments.>> disp(sprintf('圆周率pi= %8.5f',pi))
EXCEL表中LEFT和RIGHT函数的用法 left和right函数
在用EXCEL表中的时候,懂得一些常用的函数,会给你的工作带来很大便利。就像上次偶然的机会,听同事说道LEFT和RIGHT函数的用法,还挺有用的。像导出的财务数据,日期的格式都是2010-01-01,但是如果你只需要年月,不需要日期,你可以插入另外一列,适用
英语中副词的用法 英语中形容词的用法
英语中副词的用法——简介副词(adverb)是一类用以修饰动词(相当于英语的verb)或加强描绘词组或整个句子的词,修饰名词的词一般为形容词,又称限制词。 英语中副词的用法——方法/步骤英语中副词的用法 1、一般副词的位置 在许多情
SQL中DISTINCT关键字的用法 linq distinct 用法
Select中DISTINCT关键字的用法?distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是distinct只能返回它的目标字段,而无法返回其它字段下面先来看