对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<、<=、!=),并非说用>,>=,=,between..and 时会提示SQL语法错误,而是经常是查不出一条记录来,还会出现似乎是莫名其妙的结果来,其实您只要理解好了这个 rownum 伪列的意义就不应该感到惊奇,同样是伪列,rownum 与 rowid 可有些不一样,下面以例子说明
假设某个表 t1(c1) 有 20 条记录
如果用 select rownum,c1 from t1 where rownum < 10, 只要是用小于号,查出来的结果很容易地与一般理解在概念上能达成一致,应该不会有任何疑问的。
可如果用 select rownum,c1 from t1 where rownum > 10 (如果写下这样的查询语句,这时候在您的头脑中应该是想得到表中后面10条记录),你就会发现,显示出来的结果要让您失望了,也许您还会怀疑是不谁删了一些记录,然后查看记录数,仍然是 20 条啊?那问题是出在哪呢?
先好好理解 rownum 的意义吧。因为ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。简单的说 rownum 是对符合条件结果的序列号。它总是从1开始排起的。所以你选出的结果不可能没有1,而有其他大于1的值。所以您没办法期望得到下面的结果集:
11 aaaaaaaa
12 bbbbbbb
13 ccccccc
.................
rownum >10 没有记录,因为第一条不满足去掉的话,第二条的ROWNUM又成了1,所以永远没有满足条件的记录。或者可以这样理解:
ROWNUM是一个序列,是oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则rownum值为1,第二条为2,依次类推。如果你用>,>=,=,between...and这些条件,因为从缓冲区或数据文件中得到的第一条记录的rownum为1,则被删除,接着取下条,可是它的rownum还是1,又被删除,依次类推,便没有了数据。
有了以上从不同方面建立起来的对 rownum 的概念,那我们可以来认识使用 rownum 的几种现像
1. select rownum,c1 from t1 where rownum != 10 为何是返回前9条数据呢?它与 select rownum,c1 from tablename where rownum < 10 返回的结果集是一样的呢?
因为是在查询到结果集后,显示完第 9 条记录后,之后的记录也都是 != 10,或者 >=10,所以只显示前面9条记录。也可以这样理解,rownum 为9后的记录的 rownum为10,因条件为 !=10,所以去掉,其后记录补上,rownum又是10,也去掉,如果下去也就只会显示前面9条记录了
2. 为什么 rownum >1 时查不到一条记录,而 rownum >0 或 rownum >=1 却总显示所以的记录
因为 rownum 是在查询到的结果集后加上去的,它总是从1开始
3. 为什么 between 1 and 10 或者 between 0 and 10 能查到结果,而用 between 2 and 10 却得不到结果
原因同上一样,因为 rownum 总是从 1 开始
从上可以看出,任何时候想把 rownum = 1 这条记录抛弃是不对的,它在结果集中是不可或缺的,少了rownum=1 就像空中楼阁一般不能存在,所以你的 rownum 条件要包含到 1
但如果就是想要用 rownum > 10 这种条件的话话就要用嵌套语句,把 rownum 先生成,然后对他进行查询。
select *
from (selet rownum as rn,t1.* from a where ...)
where rn >10
一般代码中对结果集进行分页就是这么干的。
另外:rowid 与 rownum 虽都被称为伪列,但它们的存在方式是不一样的,rowid 可以说是物理存在的,表示记录在表空间中的唯一位置ID,在DB中唯一。只要记录没被搬动过,rowid是不变的。rowid 相对于表来说又像表中的一般列,所以以 rowid 为条件就不会有 rownum那些情况发生。
上面的内容主要是综合 CSDN 上一篇贴子 请教rownum问题,为何不支持>,>=,=,between...and 中几个网友的回复而来。
分享到:
相关推荐
对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<、<=、!=),并非说用>,>=,=,between..and 时会提示SQL语法错误,而是经常是查不出一条记录来,还会出现似乎是莫名其妙的结果...
如果你使用 >, >=, =, between...and 这些条件,因为从缓冲区或数据文件中得到的第一条记录的 ROWNUM 为 1,则被删除,接着取下条,可是它的 ROWNUM 还是 1,又被删除,依次类推,便没有了数据。 例如,使用 ...
在Oracle数据库中,`ROWNUM`是一个非常有用的伪列,用于限制查询结果的行数,尤其是在处理大数据量或进行分页查询时。然而,`ROWNUM`的使用并不直观,尤其是当涉及到比较运算符(如`>`, `>=`, `=`等)时,容易引发...
Oracle的`ROWNUM`是一个伪列,它在查询结果集中自动添加,并从1开始为每一行赋予一个唯一的数字。在处理大数据集时,`ROWNUM`常用于限制返回的行数,实现分页或者筛选特定范围的记录。然而,正确理解和使用`ROWNUM`...
ROWNUM 是 Oracle 中的一种伪列,它可以根据返回记录生成一个序列化的数字。利用 ROWNUM,我们可以生产一些原先难以实现的结果输出,但是因为它是伪列的特殊性,在使用时需要注意一些事项,以免掉入“陷阱”。 特殊...
例如,要获取第N到M条记录,可以先选择`WHERE ROWNUM <= M`,然后在外部查询中使用`WHERE ROWNUM > N`。另外,也可以使用`BETWEEN N AND M`来获取相同的结果。 3. **陷阱与注意事项**:ROWNUM的生成是基于查询的...
总的来说,`ROWNUM`伪列是Oracle中实现简单分页查询的一个有效工具,但当面对更复杂的需求时,可能需要结合使用`ROW_NUMBER()`和其他窗口函数。正确理解和运用这些功能,能帮助你更高效地处理大数据集,并提供流畅的...
ROWNUM是Oracle数据库中的一个特殊列,用于为查询结果集中的每一行分配一个唯一的序号。这一功能非常强大,尤其在处理诸如“获取前N条记录”或“实现数据分页”的场景时尤为有用。 #### 二、特殊结果输出 ##### ...
ROWNUM只能使用小于等于(<, <=)符号,不能使用大于等于(>, >=),并且如果使用等号(=),只能等于1。另外,ROWNUM可以与子查询结合,通过ORDER BY排序后,利用ROWNUM创建顺序号,如:`SELECT * FROM (SELECT a.*...
`ROWNUM <= 40`用于限制返回的最大行数,而`RN >= 21`则确定了返回结果的起始行。这种方法在大多数情况下效率较高,因为Oracle的 Cost-Based Optimizer (CBO) 可以将外层的`ROWNUM`限制推入内层查询,一旦达到限制,...
在Oracle数据库中,`ROWNUM`是一个非常有用的伪列,它可以帮助用户在查询结果集中为每一行分配一个唯一的行号。`ROWNUM`的值从1开始,并随着行的增加而递增。下面将详细介绍`ROWNUM`的基本用法及其在不同场景下的...
2. **不支持某些比较操作符**:ROWNUM不支持直接使用">"、">="、"="或"between...and"这样的比较操作符。这是因为ROWNUM的值是在查询过程中逐行生成的,如果使用这些操作符,可能会导致预期之外的结果。例如,`WHERE...
Oracle数据库中的`ROWNUM`是一个特殊的伪列,用于在查询结果集中为每一行分配一个唯一的数字,从1开始递增。然而,`ROWNUM`的行为并不像常规的列,这导致了许多开发者在使用时遇到困惑。以下是关于`ROWNUM`的一些...
Oracle支持ROWNUM伪列来进行分页,但这种方法在处理大数据量时效率较低。更好的方法是使用Oracle的"OFFSET-FETCH"语法,类似于SQL Server的"TOP-N"。例如: ``` SELECT * FROM (SELECT T.*, ROWNUM RN FROM ...
这里引入了伪列ROWNUM,它表示当前行的序列号。然而,直接使用ROWNUM进行分页查询可能会遇到问题。例如,试图通过以下查询获取第30到49行的数据: ```sql select * from all_objects where rownum between 30 and ...
在Oracle中,我们可以使用ROWNUM伪列来实现分页。ROWNUM是Oracle为每一行生成的一个唯一的数字,但在实际使用中,ROWNUM并不能直接实现分页,因为它的值会在查询时立即确定,无法按页进行筛选。 为了实现分页,我们...
在Oracle中,实现分页查询有两种常见方法:第一种方法是利用`ROWNUM`伪列结合子查询;第二种方法则是使用`FETCH FIRST`子句(在Oracle 12c及以上版本中可用)。本文将重点介绍第一种方法,并详细解析其背后的原理与...
这篇笔记主要探讨了Oracle中的两个重要概念——伪列(Rownum和Rowid),以及如何使用子查询进行复杂的数据操作。 首先,伪列是Oracle数据库中一种特殊类型的列,它们并不实际存在于表的结构中,但可以通过SQL查询来...
- **中间层查询**:添加了`ROWNUM`列,并通过`WHERE ROWNUM <= 40`来限制返回的记录数量。这里的`40`表示每页显示的记录总数。 - **最外层查询**:通过`WHERE RN >= 21`进一步筛选出特定页的记录。例如,如果每页...