Oracle PL/SQL开发基础(第七弹:ROWNUM伪列)
来源:互联网 发布:linux系统api有哪些 编辑:程序博客网 时间:2024/06/10 01:13
在Oracle中,没有类似于SQL Server中的TOP关键字来获取表中的前几条记录,但是提供了一个更加方便的方法:使用ROWNUM伪列。ROWNUM伪列是Oracle先查到结果集之后再加上去的一个伪列,这个伪列对符合条件的结果添加一个从1开始的序列号。
比如要查询员工表中前10条记录:
SELECT ROWNUM, empno, ename, job, mgr, hiredate FROM emp WHERE ROWNUM <= 10;
ROWNUM与ROWID最大的不同在于,ROWID是物理存在的,而ROWNUM是动态的,先查到结果集后再加上去的一个列,因此必须有结果集。如果我们写WHERE ROWNUM > 10,当生成结果集时,Oracle首先产生一条ROWNUM为1的记录,显然不匹配ROWNUM > 10这个条件,该条记录被过滤掉后,后生成的记录的ROWNUM依然会是1,因此如果ROWNUM > 10,将不会得到任何结果。所以如果要提取记录中间的记录,必须使用子查询,例如下面的语句将获取第5条到第10条的员工记录:
SELECT recno, empno, ename FROM (SELECT ROWNUM recno, empno, ename FROM emp) WHERE recno >= 5 AND recno <= 10;
上面的语句先使用ROWNUM得到具体的记录编号,在外层的查询中过滤具体的记录编号,得到结果集。
知道了ROWNUM的原理以后,我们就可以知道,取前10条记录,除了上面介绍过的写法以外,还能这样写:
SELECT ROWNUM, empno, ename, job, mgr, hiredate FROM emp WHERE ROWNUM != 11;
取第5到第10条记录,除了上面介绍过的写法以外,还能这样写:
SELECT recno, empno, ename FROM emp WHERE ROWNUM <= 10MINUSSELECT recno, empno, ename FROM emp WHERE ROWNUM < 5
对于ROWNUM,只能使用<
,<=
,!=
,不能使用>
,>=
,BETWEEN AND
。如果使用>
,>=
,BETWEEN AND
的话,永远查不到记录。
对于=
,只能使用ROWNUM = 1
。如果使用ROWNUM = 2
的话,永远查不到记录。
还有一点特别重要,那就是ROWNUM和排序一起使用的时候要特别注意。ROWNUM的是在取数据的时候产生的序号,所以想对指定排序的数据去指定ROWNUM的时候要注意。
比如:
SELECT ROWNUM, empno, sal FROM emp ORDER BY sal
上面这样写是得不到想要的结果的。因为ROWNUM并不是按照排序以后的结果来生成序号。系统是按照记录插入时的顺序给记录排的号。为了解决这个问题,必须使用子查询:
SELECT ROWNUM, empno, sal FROM (SELECT empno, sal FROM emp ORDER BY sal);
- Oracle PL/SQL开发基础(第七弹:ROWNUM伪列)
- Oracle PL/SQL开发基础(第八弹:ROWID伪列)
- [Oracle]高效的PL/SQL程序设计(一)--伪列ROWNUM使用技巧
- [Oracle]高效的PL/SQL程序设计(一)--伪列ROWNUM使用技巧
- [Oracle]高效的PL/SQL程序设计(一)--伪列ROWNUM使用技巧
- Oracle rownum 伪列
- oracle伪列rownum
- Oracle伪列rownum
- Oracle伪列rownum
- Oracle-伪列(rownum)
- oracle中的伪列rownum
- Oracle Rownum 伪列详解
- oracle中的伪列rownum
- Oracle Rownum 伪列详解
- Oracle Rownum 伪列详解
- Oracle中的伪列ROWNUM
- Oracle Rownum 伪列详解
- oracle中的伪列 rownum
- 六、Spring Boot日志管理
- Linux系统编程——线程基础知识
- springMVC 注解 controller层的优化
- Python:Matplotlib 画图(Code)
- 编译mysql ,出现 error: No curses/termcap library found
- Oracle PL/SQL开发基础(第七弹:ROWNUM伪列)
- androguard笔记
- FZU 2239 Daxia & Yayamao's problem 斜率优化
- SpringMVC介绍之视图解析器ViewResolver
- Serializable、Parcelable 的简介及区别
- js生成当月日历
- 题目1025:最大报销额
- 如何使用msysgit上传本地工程到GitHub
- jsp的3个编译指令(page,include,taglib)