• 转:关于ROWNUM的使用


    转载自:原文:https://blog.csdn.net/songsenkeji/article/details/4432942 

    ROWNUM的概念
    ROWNUM是一个虚假的列。它将被分配为 1,2,3,4,...N,N 是行的数量。一个ROWNUM值不是被永久的分配给一行 (这是最容易被误解的)。表中的某一行并没有标号;你不可以查询ROWNUM值为5的行——根本没有这个概念。另一个容易搞糊涂的问题是ROWNUM值是何时被分配的。ROWNUM值的分配是在查询的谓词解析之后,任何排序和聚合之前进行的。ROWNUM值只有当被分配之后才会增长。这就是为什么下面的查询永远都不会返回结果:
    select * from countries where rownum>1;
    ROWNUM > 1对于第一行来说并不是真值,ROWNUM没有增长到 2。所以,没有比1大的ROWNUM.永远都不要使用’ROWNUM>?‘和’ROWNUM=2…N’这样的条件。

    用rownum显示排序结果的前N条记录
    FROM/WHERE子句先被执行.
    根据FROM/WHERE子句输出的行, ROWNUM被分配给他们并自增长.
    SELECT 被应用.
    GROUP BY 被应用.
    HAVING is 被应用.
    ORDER BY 被应用.
    这就是为什么下面的SQL几乎总是错误的:
    select rownum,job_title,min_salary
    from jobs where rownum<3 order by min_salary;
    正确的写法:
            select rownum,tmp.* from (
            select job_title,min_salary
            from jobs order by min_salary) tmp
            where rownum<=3;

    用ROWNUM实现分页
    select * from
            (select /*+ FIRST_ROWS(n) */ a.*,ROWNUM rnum
            from (your_query_goes_here, with order by) a
            where ROWNUM <=
            :MAX_ROW_TO_FETCH )
    where rnum >= :MIN_ROW_TO_FETCH;
    FIRST_ROWS(N)使优化器考虑最短时间获得前N条记录.
    :MAX_ROW_TO_FETCH 某一页中结果集的最后一行。如果你每页显示10行,要显示第6页,那么此值取60。
    :MIN_ROW_TO_FETCH 某一页中结果集的第一行。如果你每页显示10行,要显示第6页,那么此值取50。

    ROWNUM对性能的影响
    ROWNUM可以避免oracle在磁盘上进行排序。rownum无法避免全表扫描的发生,但是它可以避免对整个表数据的排序操作,在指定了rownum后,排序操作在内存中可以轻松完成。


    我的补充:

    使用rownum分页示例:

     1 --方式一:比第二种效率高
     2 select * from
     3 (
     4     select A.*,rownum RN 
     5     from (select * from t1)A
     6     where RN<=40
     7 )where RN>21
     8 --方式二:
     9 select * from
    10 (
    11     select A.*,rownum RN 
    12     from (select * from t1)A
    13 )where RN between 21 and 40
  • 相关阅读:
    TcIC(Teamcenter集成CatiaV5)的安装
    centos7上使用bind解析子域名
    Windows10 家庭版(1903/1909)中用RDPWrapper-v1.6.2和autoupdate补丁开启远程桌面功能
    修改SQL Server Express 2019 sa用户密码的方法
    微星B450主板安装64G内存的一个小招数
    缩小xfs文件系统的CentOS/RedHat虚拟机硬盘的迂回方法
    MQL命令的打开方式
    台电TBook二合一本全新安装Windows10
    django_auth_ldap
    开始认真学计算机网络----computer network学习笔记(一)
  • 原文地址:https://www.cnblogs.com/mySummer/p/10598935.html
Copyright © 2020-2023  润新知