首页 > 数据库 >Oracle rownum用法

Oracle rownum用法

时间:2024-09-10 08:52:43浏览次数:10  
标签:name 记录 查询 emp Oracle rownum 用法 select

ownum是oracle特有的一个关键字。

对于基表,在insert记录时,oracle就按照insert的顺序,将rownum分配给每一行记录,因此在select一个基表的时候,rownum的排序是根据insert记录的顺序显示的。例如:

select rownum rn,t.* from emp t;

对于子查询,则rownum的顺序是根据子查询的查询顺序进行动态分配的,例如:

select rownum as t2_rn, t2.*
  from (select rownum as t1_rn, t1.* from emp t1 order by t1.sal) t2;

由上图可以看到T1_RN和T2_RN的区别。

t1中的rownum是根据emp这个基表的默认顺序分配的,而内层子循环是根据SAL字段进行排序,所以t2的rownum是根据内层子查询的记录顺序分配的。

rownum可以用于限制返回查询的总行数,且rownum不可以以任何表的名称作为前缀。

1、rownum对于等于某值的查询条件:如果想找到第一条查询数据,可以使用rownum=1作为查询条件,但是想找到第二条查询数据,使用rownum=2则查不到数据,原因是:rownum都是从1开始,但是1以上的自然数与rownum做等于时,都认为是false条件,所以无法查询到rownum=n (n>1的自然数);

2、rownum对于大于某值的查询条件:要是想查询出第二行以后的记录,直接使用rownum>2是查不出数据的,原因是rownum是一个总是以1开始的伪例,rownum>n (n>1的自然数)依然不成立。可以使用子查询来解决,注意子查询中的rownum必须要有别名,否则还是不会查出记录来,这是因为rownum不是某个表的列,如果不起别名的话,无法知道rownum是子查询的列还是主查询的列。例如:

select * from(select rownum no ,id,name from student) where no>2;

3、rownum对于小于某值的查询条件: rownum对于rownum<n((n>1的自然数)的条件认为是成立的,所以可以找到记录。

注意:对于查询rownum在某区间的数据,必须使用子查询,例如要查询rownum在第二行到第三行之间的数据,包括第二行和第三行数据,那么我们只能写以下语句,先让它返回小于等于三的记录行,然后在主查询中判断新的rownum的别名列大于等于二的记录行。但是这样的操作会在大数据集中影响速度。

select * from (selectrownum no,id,name from student where rownum<=3 ) where no >=2

4、rownum和排序 Oracle中的rownum的是在取数据的时候产生的序号,所以想对指定排序的数据去指定的rowmun行数据就必须注意了。

select rownum ,id,name from student order by name;

对于这个查询语句,rownum并不是按name生成的序号,系统是按照记录插入时的顺序给记录排的号,rowid也是顺序分配的。为了解决这个问题,必须使用子查询:

select rownum ,id,name from (select * from student order by name);

rownum的一些使用技巧

场景一:使用rownum限制查询返回的记录数

1、例如,我们现在只想看到emp表中的第一条记录:

select * from emp where rownum=1;

2、现在,我们现在想查看emp中的前2条记录:

select * from emp where rownum<=2;

3、假如我们现在只想查看emp中的第二条记录,又该如何写语句呢?

如果where条件为:rownum=2,来看看查询结果:

发现没有查出任何数据,为什么呢?

因为rownum并不是当作实体数据存放在每一张表中,而是在每一次select查询的时候,根据基表的默认insert顺序由oracle动态分配的,有1才有2,如果rownum没有1,那么2也就没有了意义,所以这个查询就不会有任何结果出来。这个时候我们就需要利用子查询和别名列来实现这个需求:

select *
  from (select rownum as rn, t.* from emp t where rownum <= 2)
where rn = 2;

首先通过子查询,取出emp表的前2条记录,并将子查询中的rownum定义为别名rn,然后在外层查询中,使用where条件使rn=2即可,查询出emp表的第二条记录:

几种分页查询SQL语句

效率高的写法

无ORDER BY排序的写法。(效率最高)

(经过测试,此方法成本最低,只嵌套一层,速度最快!即使查询的数据量再大,也几乎不受影响,速度依然!)

SELECT *
  FROM (SELECT ROWNUM AS rowno, t.*
          FROM emp t
         WHERE hire_date BETWEEN TO_DATE('20060501', 'yyyymmdd') AND
               TO_DATE('20060731', 'yyyymmdd')
           AND ROWNUM <= 20) table_alias
 WHERE table_alias.rowno >= 10;

有ORDER BY排序的写法。(效率较高)

(经过测试,此方法随着查询范围的扩大,速度也会越来越慢)

SELECT *
  FROM (SELECT tt.*, ROWNUM AS rowno
          FROM (SELECT t.*
                  FROM emp t
                 WHERE hire_date BETWEEN TO_DATE('20060501', 'yyyymmdd') AND
                       TO_DATE('20060731', 'yyyymmdd')
                 ORDER BY create_time DESC, emp_no) tt
         WHERE ROWNUM <= 20) table_alias
 WHERE table_alias.rowno >= 10;

效率垃圾但又似乎很常用的分页写法

SELECT *
  FROM (SELECT ROWNUM AS rowno, t.*
          FROM k_task t
         WHERE flight_date BETWEEN TO_DATE('20060501', 'yyyymmdd') AND
               TO_DATE('20060731', 'yyyymmdd')) table_alias
 WHERE table_alias.rowno <= 20
   AND table_alias.rowno >= 10;
-- TABLE_ALIAS.ROWNO  between 10 and 100;

 

链接: https://www.cnblogs.com/xfeiyun/p/16355165.html

标签:name,记录,查询,emp,Oracle,rownum,用法,select
From: https://www.cnblogs.com/gdjgs/p/18405735

相关文章

  • 高级DBA培训02:国产麒麟操作系统+Oracle11gR2安装配置
    一、高级DBA培训02:国产麒麟操作系统+Oracle11gR2安装配置:本课程大纲内容如下:(*)国产麒麟-Oracle11gR2课程环境规划(*)国产麒麟Linux操作系统安装(*)国产麒麟安装Oracle11gR2的操作系统参数配置(*)国产麒麟静默安装Oracle11gR2过程(*)国产麒麟静默配置Oracle11g监听服务(*)国产麒麟静默创建Orac......
  • 高级DBA培训04:Oracle11gR2迁移到国产麒麟操作系统(单机/RAC)
    一、高级DBA培训04:Oracle11gR2迁移到国产麒麟操作系统(单机/RAC)本课程大纲内容如下:(*)Oracle11gR2迁移到国产麒麟操作系统(单机)(*)Oracle11gR2迁移到国产麒麟操作系统(RAC)学习地址:https://edu.51cto.com/course/37405.html欢迎加入:51CTO学堂风哥大数据/Oracle/MySQL数据库学习专用QQ群:4541......
  • C++ 多线程代码性能分析——Oracle Developer Studio工具教程
        最近写项目的时候,为了提升性能,把原来一些单线程的代码改成了并行运行。这里我用到的用于评估性能提升效果的工具是OracleDeveloperStudio,不过刚上手时,发现网上相关的教程和博客较少,有些功能的使用也是摸索着过来的,这一过程可谓是十分痛苦了……如今距离初次接触......
  • 【优技教育】Oracle 19c OCP 082题库(第16题)- 2024年修正版
    【优技教育】Oracle19cOCP082题库(Q16题)-2024年修正版考试科目:1Z0-082考试题量:90通过分数:60%考试时间:150min本文为(CUUG原创)整理并解析,转发请注明出处,禁止抄袭及未经注明出处的转载。原文地址:http://www.cuug.com/index.php?s=/home/article/detail/id/3397.html第......
  • 基于Oracle数据库的网络教学系统的开发和应用论文+任务书+翻译+代码
    !!!有需要的小伙伴可以通过文章末尾名片咨询我哦!!! ......
  • 微信小程序 云数据库 Collection/Query .orderBy 用法
    Collection.orderBy/Query.orderBy指定查询排序条件方法签名如下:functionorderBy(fieldName:string,order:string):Collection|Query方法接受一个必填字符串参数fieldName用于定义需要排序的字段,一个字符串参数order定义排序顺序。order只能取asc或desc。如果需要......
  • 微信小程序 云数据库 Collection/Query .orderBy 用法
    Collection.orderBy/Query.orderBy指定查询排序条件方法签名如下:functionorderBy(fieldName:string,order:string):Collection|Query方法接受一个必填字符串参数fieldName用于定义需要排序的字段,一个字符串参数order定义排序顺序。order只能取asc或desc。如果需要......
  • 深入FastAPI:掌握使用多个关联模型的高级用法
    在构建RESTfulAPI时,经常需要处理复杂的数据关系。FastAPI通过支持多个关联模型,使得定义这些关系变得简单直观。这种方法不仅提高了代码的可维护性,还增强了API的灵活性。通过使用Pydantic库,我们可以轻松定义数据模型及其关联,从而在FastAPI应用中实现强大的数据处理逻辑。无论是一对......
  • 问:聊一下NIO模型在Netty框架中的用法?
    1.核心概念和特点Netty是一个基于JavaNIO(Non-blockingI/O)的高性能网络应用框架,它简化了网络编程,如TCP和UDP套接字服务器的开发。Netty的核心概念包括:Channel:Netty中的基本I/O操作抽象。Channel表示一个打开的连接,可以进行读写操作。EventLoop:负责处理Channel上的事件......
  • 这些ES6用法你都会吗?
    一关于取值取值在程序中非常常见,比如从对象obj中取值constobj={a:1b:2c:3d:4}吐槽:consta=obj.a;constb=obj.b;constc=obj.c;//或者constf=obj.a+obj.b;constg=obj.c+obj.d;改进:用ES6解构赋值const{a,b,c,d}=obj......