刚学ORACLE的时候,就先入为主地认为rownum是一种类似于SQLSERVER的TOP关键字一样的机制————起码咱们最常用的分页可以用这个搞定。
事实并非如此,学习的时候,“空”是很重要的,以前的经验往往是一种坏处。
SQLSERVER中,如果TOP关键字和ORDER BY关键字一起出现,是先ORDER BY 后再TOP。也就是说:取得最前面的几条记录是经过排序的。
而ORACLE中,如果使用WHERE rownum<=N和ORDER BY一起出现的话,ROWNUM优先于ORDER BY。也就是说,ORDER BY无法对所有满足条件的记录排序,只能对当前的rownum<=N中的N条记录排序。
看下面这个分页的查询:
SELECT LimitResult.*
FROM
(
SELECT *, rownum AS r
FROM ATable
WHERE rownum<=40
ORDER BY createTime DESC
) LimitResult
WHERE LimitResult.r>20
--每页20条,取第二页
查询的结果中,仅仅只是对当前页的CreateTime进行了倒序排列,并没有按照所有记录的倒序排列。说明rownum的限制优先于ORDER BY。不得已把查询修改成下面的样子:
SELECT LimitResult.*
FROM
(
SELECT OrderResult.*, rownum AS r
FROM
(
SELECT *
FROM ATable
ORDER BY createTime DESC
) OrderResult
WHERE rownum<=40
) LimitResult
WHERE LimitResult.r>20
明显效率没有以前高了,但是没办法。
以上就是我发现的规律,希望朋友们能提出更好的办法。谢谢!
分享到:
相关推荐
在Oracle数据库中,`ROWNUM`是一个非常有用的伪列,用于限制查询结果的行数,尤其是在处理大数据量或进行分页查询时。然而,`ROWNUM`的使用并不直观,尤其是当涉及到比较运算符(如`>`, `>=`, `=`等)时,容易引发...
- 在 SQL Server 中,ROW_NUMBER() 函数与 Oracle 中的 ROWNUM 功能类似,但它们之间存在一些关键差异。 - **ROW_NUMBER()** 可以基于特定的排序规则为每行分配一个连续的数字,这使得它在处理有序数据时更为灵活...
- 在使用`ORDER BY`时,如果直接在查询中使用`ROWNUM`,则可能会导致结果集的顺序与预期不符。 - **示例**: ```sql SELECT ROWNUM, ID, NAME FROM STUDENT ORDER BY NAME; ``` 上述查询将根据`NAME`字段对表`...
#### 三、ROWNUM与ORDER BY ##### 1. ROWNUM与排序 需要注意的是,`ROWNUM`的计算顺序依赖于数据检索的顺序。如果您在查询中使用了`ORDER BY`子句,那么`ROWNUM`将按照排序后的结果进行编号。例如: ```sql SELECT ...
`ROWID`是Oracle数据库中用于标识表中每行的唯一地址,与`ROWNUM`不同,它反映了数据在磁盘上的实际位置。在需要稳定排序或精确的行顺序时,应考虑使用`ROWID`,但要注意它不应用于业务逻辑,因为它可能会随着表空间...
ROWNUM 是 Oracle 中的一种伪列,它可以根据返回记录生成一个序列化的数字。利用 ROWNUM,我们可以生产一些原先难以实现的结果输出,但是因为它是伪列的特殊性,在使用时需要注意一些事项,以免掉入“陷阱”。 特殊...
4. 如果表中的主键是按照升序插入的,且查询中没有`GROUP BY`和`ORDER BY`子句,`ROWNUM`的顺序可能与主键的顺序一致。但这是偶然的,不是`ROWNUM`的固有特性。 5. 在子查询中使用`ROWNUM`并将其传递到外部查询中时...
SELECT ROWNUM, id, name FROM student ORDER BY name; ``` 可以看出,ROWNUM 并不是按照 name 列来生成的序号。系统是按照记录插入时的顺序给记录排的号,ROWID 也是顺序分配的。为了解决这个问题,必须使用子查询...
这意味着如果你在查询中使用了ORDER BY语句,但没有将ROWNUM放在子查询中,ROWNUM的顺序将不会按照预期的排序来生成。例如,`SELECT ROWNUM, id, name FROM student ORDER BY name`将返回ROWNUM按照数据本身存储的...
SELECT ROWNUM, ID, NAME FROM STUDENT ORDER BY NAME; ``` 可以看出,ROWNUM并不是按照NAME列来生成的序号。系统是按照记录插入时的顺序给记录排的号,ROWID也是顺序分配的。为了解决这个问题,必须使用子查询。 ...
总结一下,`ROWNUM`在Oracle中用于限制查询返回的行数,但它的行为并不直观,特别是在与`ORDER BY`一起使用时。理解`ROWNUM`的生成原理以及其与`ORDER BY`的交互对于优化SQL查询和获取预期结果至关重要。在实际的...
### 在Oracle中灵活使用Rownum和RowId 在Oracle数据库中,`ROWNUM` 和 `ROWID` 是两个非常重要的概念,它们可以帮助我们在查询数据时实现更灵活的数据管理。本文将详细介绍这两个概念的区别及其使用方法,并通过...
2. **优化查询**:与`ORDER BY`一起使用时,先筛选`ROWNUM`再排序可以提高效率,避免全表排序。 3. **联合查询**:在多个表的连接查询中,通过`ROWNUM`过滤结果可以减少不必要的数据处理。 五、ROWID应用示例 `...
需要注意的是,`ROWNUM`的筛选是在数据读取过程中进行的,而非对整个数据集进行排序后筛选,所以如果你没有指定`ORDER BY`子句,返回的结果顺序可能是不确定的。 在进行分页查询时,`ROWNUM`结合`ROWCOUNT`或者`...
2. **ORDER BY与ROWNUM的交互**:如果需要先排序再限制结果数量,最好使用子查询的方法,确保排序后的数据被正确计数。 3. **性能考虑**:在处理大量数据时,应考虑使用其他方法如窗口函数(如RANK()、ROW_NUMBER()...
总的来说,虽然 MySQL 没有内置的 `ROWNUM` 功能,但通过用户定义变量和子查询,我们可以实现与 Oracle 相似的逻辑。理解这些技巧对于那些习惯于 Oracle SQL 而又需要在 MySQL 中工作的开发者来说至关重要。希望这些...
一、oracle中rownum 用于从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,而且rownum不能以任何表的名称作为前缀。 1、rownum 对于
Oracle 查询中 ROWNUM 与 ORDER BY 的关系 在 Oracle 中,使用 ORDER BY 语句对数据进行排序,然后使用 ROWNUM 函数来限制输出结果集的范围。但是,需要注意的是,Oracle 在执行查询时,会首先执行 ORDER BY 语句...
### 解决Oracle分页查询中排序与效率问题 在Oracle数据库中进行分页查询时,经常会出现性能瓶颈,尤其是在处理大数据量的情况下。本篇文章将详细探讨如何优化Oracle分页查询中的排序与效率问题。 #### 一、理解...
Oracle中通常使用`ROWNUM`和`ORDER BY`结合的方式实现`SELECT TOP N`的功能。首先对数据进行排序,然后通过`ROWNUM`限制返回的行数。例如,如果我们有一个名为`CUSTOMER`的表,想按`NAME`字段的字母顺序获取前三个...