Oracle的rownum原理
Oracle中,按特定条件查询前N条记录,用个rownum就搞定了:
SQL> select * from dept where rownum<3;
而对rownum用">",会失败:
SQL> select * from dept where rownum>3;
Oracle中rownum背后的机制:
1. Oracle执行SQL,得到第一行,rownum=1;
2. 判断得到的这一行是否满足条件。如果满足条件,返回此行,rownum=1;如果不满足条件,丢弃此行,继续读取下一行。
3. 读取下一行(如果上一步骤中找到满足条件的行),若满足条件,则rownum+1;否则rownum保持不变。
4. 重复3的动作,直到fetch完表中的数据。
了解了原理,就知道rownum>3不会成功,因为在第2步的时候查询出的行已经被丢弃,第3步查出来的rownum仍然是1,这样永远也不会成功。同样道理,rownum如果单独用=,也只有在rownum=1时才有用。
对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,而且rownum不能以任何表的名称作为前缀。
举例说明:
SQL> select * from dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
(1) rownum 对于等于某值的查询条件
如果希望找到部门表中第一条部门的信息,可以使用rownum=1作为条件。但是想找到部门表中第二条部门的信息,使用rownum=2结果查不到数据。因为rownum都是从1开始,但是1以上的自然数在rownum做等于判断是时认为都是false条件,所以无法查到rownum = n(n>1的自然数)。
SQL> select rownum,deptno,dname from dept where rownum=1;(可以用在限制返回记录条数的地方,保证不出错,如:隐式游标)
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
SQL> select rownum,deptno,dname from dept where rownum=2;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
(2) rownum对于大于某值的查询条件
如果想找到从第二行记录以后的记录,当使用rownum>2是查不出记录的,原因是由于rownum是一个总是从1开始的伪列,Oracle 认为rownum> n(n>1的自然数)这种条件依旧不成立,所以查不到记录。
SQL> select * from dept where rownum>3;
未选定行
那如何才能找到第二行以后的记录?可以使用以下的子查询方法来解决。
注意:子查询中的rownum必须要有别名,否则还是不会查出记录来,这是因为rownum不是某个表的列,如果不起别名的话,无法知道rownum是子查询的列还是主查询的列。
SQL> select * from (select rownum rn,deptno,dname from dept) where rn>2;
RN DEPTNO DNAME
---------- ---------- --------------
30 SALES CHICAGO
40 OPERATIONS BOSTON
(3) rownum对于小于某值的查询条件
如果想找到第三条记录及以前的记录,当使用rownum<=3是能得到两条记录的。显然rownum对于rownum<=n((n>1的自然数)的条件认为是成立的,所以可以找到记录。
SQL> select * from dept where rownum<=3;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
(4) rownum对于区间查询条件
从上可以看出rownum对小于某值的查询条件是为true的,rownum对于大于某值的查询条件直接认为是false的。那就必须使用子查询。
例如要查询rownum在第二行到第三行之间的数据,包括第二行和第三行数据,那么我们只能写以下语句,先让它返回小于等于三的记录行,然后在主查询中判断新的rownum的别名列大于等于二的记录行。但是这样的操作会在大数据集中影响速度。
SQL> select * from (select rownum rn,deptno,dname from dept where rownum<=3) where rn>=2;
RN DEPTNO DNAME
---------- ---------- --------------
2 20 RESEARCH
3 30 SALES
(5) rownum和排序
Oracle中的rownum的是在取数据的时候产生的序号,所以想对指定排序的数据去指定的rowmun行数据就必须注意了。
SQL> select rownum,deptno,dname from dept order by dname;
ROWNUM DEPTNO DNAME
---------- ---------- --------------
1 10 ACCOUNTING
4 40 OPERATIONS
2 20 RESEARCH
3 30 SALES
可以看出,rownum并不是按照dname列来生成的序号。系统是按照记录插入时的顺序给记录排的号,rowid也是顺序分配的。为了解决这个问题,必须使用子查询。
SQL> select rownum,deptno,dname from(select * from dept order by dname);
ROWNUM DEPTNO DNAME
---------- ---------- --------------
1 10 ACCOUNTING
2 40 OPERATIONS
3 20 RESEARCH
4 30 SALES
这样就成了按dname排序,并且用rownum标出正确序号(有小到大)。
Oracle的rownum原理的更多相关文章
- Oracle中rownum原理介绍
rownum原理如下:1.执行查询操作2.将第一行的row num置为13.将得到的行的row num与条件相比较,如果不匹配,则抛弃行,如果匹配,则返回行4.oracle获取下一行,然后将rownu ...
- Oracle的rownum原理和使用
整理和学习了一下网上高手关于rownum的帖子: 参考资料: http://tech.ddvip.com/2008-10/122490439383296.html 和 http://tenn.jav ...
- Oracle的rownum原理和使用(整理几个达人的帖子)
整理和学习了一下网上高手关于rownum的帖子: 参考资料: http://tech.ddvip.com/2008-10/122490439383296.html 和 http://tenn.jav ...
- oracle中rownum和row_number()
row_number()over(partition by col1 order by col2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内 ...
- ORACLE 中rownum和row_number()的使用区别(可指定取sql结果集的第几个数据)
这篇文章主要介绍了oracle中rownum和row_number()的使用方法以及区别和联系,十分的详细,有需要的小伙伴可以参考下. row_number()over(partition by ...
- oracle关于rownum的使用【oracle】
转自:https://blog.csdn.net/qiuzhi__ke/article/details/78892822 关于rownum是怎么产生的(网上有不少的文章,下面是摘录): rownum是 ...
- ORACLE 中ROWNUM用法总结(转)
ORACLE 中ROWNUM用法总结! 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=) ...
- 【Oracle】oracle中rownum的说明及使用技巧
oracle中常用到ROWNUM,所以做一些本人对rownum的一些认识和使用技巧的记录,以便备查. 一.rownum的说明 rownum是oracle特有的一个关键字. (1)对于基表,在inser ...
- oracle之rownum(伪列)
整理和学习了一下网上高手关于rownum的帖子: 参考资料: http://tech.ddvip.com/2008-10/122490439383296.html 和 http://tenn.jav ...
随机推荐
- Volly的使用及图片错位优化
listview显示数据,利用第三方jar包Volley下的ImageLoader加载图片时,当数据类型不一致,布局复用的时候会出现图片错位,因此需要自定义IMymageLoader实现ImageLo ...
- [改善Java代码]异常只为异常服务
异常原本是正常逻辑的补充,但是有时候会被当做主逻辑使用.看如下代码: public class Client { enum Color { Red, Blue; } public static voi ...
- 【置换,推理】UVa 1315 - Creaz tea party
Dsecription n participants of «crazy tea party» sit around the table. Each minute one pair of neighb ...
- linq检索带命名空间的xml
XElement el = XElement.Load(fil); XNamespace ns = "http://schemas.microsoft.com/ado/2009/11/edm ...
- Java - 正则表达式常用操作
验证 简单验证 String regex = "\\d{4}-\\d{2}-\\d{2}"; String input = "2016-01-01"; asse ...
- Git CMD - init: Create an empty Git repository or reinitialize an existing one
命令格式 git init [-q | --quiet] [--bare] [--template=<template_directory>] [--separate-git-dir &l ...
- Git CMD - rm: Remove files from the working tree and from the index
命令格式 git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [--] <file>… 命令参 ...
- C#算法基础之希尔排序
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Remote Desktop Connection Manager介绍
Remote Desktop Connection Manager (RDCMan) 是微软Windows Live体验团队的主要开发者 Julian Burger开发的一个远程桌面管理工具.简称为R ...
- C# winform 选择项 省市连动
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...