`
zhibaichuan
  • 浏览: 4424 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Rownum和row_number() over()的使用

 
阅读更多
Rownum和row_number() over()的使用
ROWNUM是oracle从8开始提供的一个伪列,是把SQL出来的结果进行编号,始终从1开始,常见的用途就是用来分页输出.
比如
SELECT *
   FROM torderdetail a
  WHERE ROWNUM <= 10
这条语句就是输出前10条纪录,在这里用途上类似于sql sever的top,不过rownum对于指定编号区间的输出应该说更强大
SELECT *
   FROM (SELECT a.*, ROWNUM rn
           FROM torderdetail a)
  WHERE rn >= 10 AND rn <= 20
这条语句即是输出第10到第20条纪录,这里之所以用rownum rn,是把rownum转成实例,因为rownum本身只能用<=的比较方式,只有转成实列,这样就可做 >=的比较了。
在实际用途中,常常会要求取最近的几条纪录,这就需要先对纪录进行排序后再取rownum<=
一般常见的
SELECT *
   FROM (SELECT   a.*
            FROM torderdetail a
        ORDER BY order_date DESC)
WHERE ROWNUM <= 10
而在CSDN曾经发生过讨论,关于取近的10条纪录,有人给出这样的语句
SELECT   a.*
     FROM torderdetail a
    WHERE ROWNUM <= 10
ORDER BY order_date DESC
之所以会出现这样的语句,主要是从效率上的考虑,前面条语句,是要进行全表扫描后再排序,然后再取10条纪录,后一条语句则不会全表扫描,只会取出10条纪录,很明显后条语句的效率会高许多。
那为什么会有争议呢,那就在于在执行顺序上争议,是先执行排序取10条纪录,还是取10条纪录,再排序呢?两种顺序取出来的结果是截然相反的,先排序再取10条,就是取最近的10条,而先取10条,再排序,则取出的最早的10条纪录。对于此语句,普遍的认为执行顺序是先取10条纪录再排序的。所以此语句应该是错误。但实际上并非如此,此语句的执行顺序和order by的字段有关系,如果你order by 的字段是pk,则是先排序,再取10条(速度比第一种语句快),而排序字段不是PK 时,是先取10条再排序,此时结果就与要求不一样了,所以第二种写法一定要在排序字段是主键的情况下才能保证结果正确。
Row_number() over()这个分析函数是从9I开始提供的,一般的用途和rownum差不多。
一般写法row_number() over( order by order_date desc) 生成的顺序和rownum的语句一样,效率也一样(对于同样有order by 的rownum语句来说),所以在这种情况下两种用法是一样的。
而对于分组后取最近的10条纪录,则是rownum无法实现的,这时只有row_number可以实现,row_number() over(partition by 分组字段 order by 排序字段)就能实现分组后编号,比如说要取近一个月的每天最后10个订单纪录
SELECT *
   FROM (SELECT a.*,
ROW_NUMBER () OVER (PARTITION BY TRUNC (order_date) ORDER BY order_date DESC)
                                                                           rn
          FROM torderdetail a)
WHERE rn <= 10
Rownum的另类用法,有时候我们会遇到这种需求,要求输出当月的所有天数,许多人会烦恼,数据库里又没有这样的表,怎么输出一个月的所有天数呢?用rownum就能解决:
SELECT     TRUNC (SYSDATE, 'MM') + ROWNUM - 1
      FROM DUAL
CONNECT BY ROWNUM <= TO_NUMBER (TO_CHAR (LAST_DAY (SYSDATE), 'dd'))
分享到:
评论

相关推荐

    SQL ROW_NUMBER()分页比较

    接下来,我们将介绍两种使用 ROW_NUMBER() 函数的方法:不正确的使用方式和正确的使用方式。 不正确的使用方式是先查出所有数据,然后再排序: ```sql select Id,Name,test from ( select row_number() over...

    Oracle数据库rownum和row_number的不同点

    3. `ROW_NUMBER()` 支持 `OVER` 子句,可以进行复杂的排序和分组操作,`ROWNUM` 则不支持。 4. `ROWNUM` 的分配是在查询开始时完成的,而 `ROW_NUMBER()` 的分配是在查询处理过程中,根据指定的排序和分区条件动态...

    ROW_NUMBER、RANK、DENSE_RANK 和 NTILE

    以下查询通过使用 ROW_NUMBER 函数并指定 OVER (ORDER BY score DESC) 生成所需的结果: ``` SELECT ROW_NUMBER() OVER(ORDER BY score DESC) AS rownum, speaker, track, score FROM SpeakerStats ``` rownum ...

    Row_number 分页存储过程

    例如,你可以创建一个名为`Pager_Rownumber`的存储过程,如下所示: ```sql CREATE PROCEDURE Pager_Rownumber @PageNumber INT, @PageSize INT, @OrderColumn NVARCHAR(128), @TableName NVARCHAR(128) AS ...

    oracle中rownum和row_number()

    在Oracle数据库中,`ROWNUM` 和 `ROW_NUMBER()` 是两个非常重要的概念,它们都用于为查询结果集的每一行分配一个唯一的数字。然而,两者在使用方式和功能上存在一定的差异。 首先,`ROWNUM` 是Oracle的一个内置伪列...

    深入探讨:oracle中row_number() over()分析函数用法

    下面我们将详细探讨`row_number() over()`的用法和特点。 首先,`row_number()`函数的基本语法是: ```sql row_number() over ( [PARTITION BY column1, column2, ...] ORDER BY column3, column4, ... ) ``` 1...

    sqlServer使用ROW_NUMBER时不排序的解决方法

    [sql] with query as (select ROW_NUMBER() over(order by (select 0)) AS ROWNUM, * FROM Product) select * from query where ROWNUM BETWEEN 5 AND 10 –2.ROW_NUMBER必须指写over (order by **),有时我根本就...

    SQL Server 2005中ROW_NUMBER()函数在存储过程分页中的应用.pdf

    SELECT ROW_NUMBER() OVER (ORDER BY column_name(s)) AS RowNum, * FROM table_name; ``` 在这个语句中,`OVER`子句定义了排序的逻辑,`ORDER BY`则指定了排序的依据。`RowNum`是生成的新列,包含了每一行的序列号...

    sqlserver 通用存储过程分页代码(附使用ROW_NUMBER()和不使用ROW_NUMBER()两种情况性能分析)

    SET @sql = 'SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY ' + @strOrder + ') AS RowNum FROM ' + @tblName IF (@strWhere != '') SET @sql = @sql + ' WHERE ' + @strWhere SET @sql = @sql + ') ...

    ROW_NUMBER SQL Server 2005的LIMIT功能实现(ROW_NUMBER()排序函数)

    SELECT ROW_NUMBER() OVER(ORDER BY id ASC) AS rownum, * FROM MyTable ) AS items WHERE items.rownum BETWEEN 20 AND 30; ``` 2. **按价格升序排序**:在 `OP_Order` 表中,按 `totalPrice` 排序并编号:...

    Oracle row_number() over()解析函数高效实现分页

    使用`row_number() over()`函数的好处在于,它可以更准确地控制行号的分配,尤其是在需要排序后分页的情况下。这种方法不仅解决了`ROWNUM`的局限性,而且通常被认为比使用子查询和`BETWEEN`更高效,因为它避免了多次...

    使用row_number()实现分页实例

    例如,在Oracle中,可以使用`ROWNUM`函数,但它有一些不同的行为和限制。 性能方面,`ROW_NUMBER()`通常比传统的`TOP`或`LIMIT`结合`OFFSET`更高效,特别是在处理大数据集时。不过,为了进一步优化性能,可以考虑...

    SQL中row-number函数用法

    ROW_NUMBER() OVER (ORDER BY xlh DESC) AS RowNum FROM employee; ``` 这条SQL语句将为`employee`表中的每一行返回一个基于`xlh`降序排列的行号。 **步骤2:结合PARTITION BY使用** ```sql SELECT * , ROW_...

    各数据库分页语法支持

    SQL Server 提供了多种分页方式,包括使用 ROW_NUMBER() 函数和 TOP 关键字结合的方式。 1. **ROW_NUMBER() 函数分页**: ```sql SELECT * FROM ( SELECT sid, ROW_NUMBER() OVER (ORDER BY sid DESC) AS ...

    SQL server中row_number(),rank(),dense_rank()排序

    SELECT Sno, Cno, Grade, ROW_NUMBER() OVER (ORDER BY Grade DESC) AS RowNum FROM SC; ``` 上述查询将按照Grade降序为每一行分配一个RowNum,成绩越高,编号越小。 2. `rank()` `rank()` 函数也返回一个唯一的...

    SQL学习笔记八 索引,表连接,子查询,ROW_NUMBER

    在SQL学习过程中,索引、表连接、子查询和ROW_NUMBER函数是四个非常重要的概念,它们对于提升查询效率和编写复杂查询语句至关重要。 首先,我们来了解一下**索引**。索引是一种特殊的数据结构,它能显著提高数据...

Global site tag (gtag.js) - Google Analytics