它是Oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,以此类推,这个伪字段可以用于限制查询返回的总行数,而且rownum不能以任何表的名称作为前缀。

  如以下语句将无法正常运行:

select student.*, student.rownum from student;

  我们如果要将rownum这个伪字段动态产生的列显示出来,需要使用如下语句:

select t.*, rownum from student t;

  如果我们在查询时加入了限制条件,则rownum又将动态生成。结论就是rownum是不会与任何一行进行绑定都是根据查询后的记录来生成的:

select t.*, rownum from student t where sage > 25;

  由于rownum的特殊性,我们在使用rownum时必须注意以下事项:

  • 如果希望找到学生表中的第一条学生信息,可以使用rownum=1作为条件。但是想找到学生表中第二条学生的信息,使用rownum=2结果查不到数据。因为rownum始终从1开始,因此1以上的自然数在rownum做等于判断时都是false条件,所以无法查到rownum=n(n>1的自然数)。
select * from student where rownum = 1;  -- 能查询到第一条记录
select * from student where rownum = 2; -- 不能查询第二条记录
  • 如果想找到从第二行记录以后的记录,当时用rownum>2是查不出来记录的,原因是由于rownum是一个总是从1开始的伪列,Oracle认为rownum>n(n>1是自然数)这种条件依旧不成立,所以查不到记录。
select * from student where rownum > 2;  -- 不能查询出记录
  • 如果想找到第三条记录之前的记录,当使用rownum<3是能得到两条记录的。显然rownum对于rownum<n(n>1的自然数)的条件认为是成立的,所以可以找到记录。
select * from student where rownum < 3;  -- 选择前两条记录
  • 如果要查询后三条记录,则要考虑的情况又会比较复杂一些,比如我们按学号(SID)和年龄(SAGE)进行倒序排列,查询最后三条记录,检查下面两个sql语句的结果有何异同:
--  正常返回最后三条记录
select * from student where rownum < 4 order by sid desc;
-- 返回了前三条记录
select * from student where rownum < 4 order by sage desc;

  我们可以看到,同样的sql语句,只是排列序不一样,就导致了完全不一样的结果。两个语句的对比中可以看出在第二条语句中rownum并不是以SAGE列生成序列号,而是在插入记录时以主键列为参考生成的。之所以我们在使用第一条语句时可以成功取得最后三条,原因就在于第一条语句是按照主键进行排序的。

  • 如果要按照非主键为依据来进行最后记录数的提取,我们需要使用复合查询语句。
select * from (select * from student order by sage desc) where rownum < 4;
  • 有的时候我们需要对记录进行分页,这时我们会期望返回一个指定范围内的记录,如,返回第10至第20条,可使用如下sql语句:
select * from student where rownum < 20
minus -- 将两个记录集相减
select * from student where rownum < 10;

  或者

select * from (select rownum r, student.* from student where rownum < 20 order by sid) where r >= 10;
  • 提到rownum,不得不得到Oracle表中另外一个隐藏列:rowid,这是存在于每一个表中的用于唯一标识一行数据的由Oracle自动生成和管理的属性,我们可以认为这是Oracle数据表中的超键,在同一个数据库中,这个超键永远都不会有重复。rowid主要用于快速定位某一行数据,有点类似于一本书的页码,可以快速找到内容,常用于索引中。下面这条sql语句可以帮助我们查看每一行数据的rowid。
select student.*, rowid from student;

关于Oracle数据库的rownum应用的更多相关文章

  1. oracle数据库之rownum和rowid用法

    Rownum 和 Rowid是Oracle数据库所特有的,通过他们可以查询到指定行数范围内的数据记录.   以下通过例子讲解: -- 为了方便,首先,查找dept表中的所有. select deptn ...

  2. Oracle数据库之rownum

    1. 介绍 当我们在做查询时,经常会遇到如查询限定行数或分页查询的需求,MySQL中可以使用LIMIT子句完成,在MSSQL中可以使用TOP子句完成,那么在Oracle中,我们如何实现呢? Oracl ...

  3. ORACLE数据库编程

    第一章 Oracle数据库基本概念 一.介绍 Oracle数据库系统是美国Oracle(甲骨文)公司提供的以分布式数据库为 核心的一组软件产品,是目前最流行的客户/服务器(Client/Server, ...

  4. oracle数据库分页原理

    Oracle数据库的rownum 在Oracle数据库中,分页方式没有MySql这样简单,它需要依靠rownum来实现.Rownum表示一条记录的行号,值得注意的是它在获取每一行后才赋予.因此,想指定 ...

  5. 各种数据库分页语句整理以及Oracle数据库中的ROWNUM和ORDER BY的区别

    .oracle数据库分页 select * from (select a.*,rownum rc from 表名 where rownum<=endrow) a where a.rc>=s ...

  6. Oracle数据库——ROWNUM

    Oracle数据库--ROWNUM 前言   刚学到了ROWNUM的用法,网上一搜,结果发现了有很多帖子,写的都很全.本着好记性不如烂笔头的原则,我还是决定自己手打一遍,当然下面也附上了我参考的链接. ...

  7. Oracle 数据库语句大全

    Oracle数据库语句大全 ORACLE支持五种类型的完整性约束 NOT NULL (非空)--防止NULL值进入指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值. CH ...

  8. [转] JAVA读取excel数据(插入oracle数据库)

    原文地址:http://blog.csdn.net/zczzsq/article/details/16803349 本实例做的是读取execl(只能读取.xls的execl,即只能读取03版的),如果 ...

  9. Oracle数据库基础知识

    oracle数据库plsql developer   目录(?)[-] 一     SQL基础知识 创建删除数据库 创建删除修改表 添加修改删除列 oracle cascade用法 添加删除约束主键外 ...

随机推荐

  1. 04Shell流程控制

    流程控制 if 单分支结构 if 条件测试 then 命令序列 fi 双分支结构 if 条件测试 then 命令序列 else 命令序列 fi 多分支结构 if 条件测试 1 then 命令序列 [e ...

  2. 页面导入样式时,使用link和@import有什么区别

    link和@import两种导入样式表的方法比较 link属于HTML标签,而@import是CSS提供的 页面被加载的时候,link会同时被加载,而@import引用的CSS会等到页面被加载完再加载 ...

  3. 一个简单的示例在spring boot中实现国际化

    最近在网上找了一个有关账单管理的spring boot项目,其中有一部分是涉及显示国际化信息的,即将页面上的中英文进行转换.因为在这之前这部分内容没有接触过,所以在这记录下过程. 中文效果图如下所示: ...

  4. ES6对正则的改进(简要总结)

    文章目录 正则的扩展 1. RegExp 构造函数 2. 字符串的正则方法 3. u 修饰符 4. y 修饰符 5. sticky 属性 6. flags 属性 7. s 修饰符:dotAll 模式 ...

  5. 更改CSDN博客皮肤的一种简易方法

    CSDN改版后,皮肤设置变得不能够更改了,不过下面这种方法依然可以做到: 首先来到博客设置的主页面:. 接下来按ctrl + shift + i进入 如下页面,然后点击图中红色标记圈起来的选择元素按钮 ...

  6. 张亦总结《AG百家乐庄闲,龙虎中下三路技巧和三株路的运用》

    ​​关于三珠路的各种打法,这里我做个详细的讲解 三珠路的打法源于澳门赌王叶汉,需要了解赌王叶汉的著作<BJL投注公式>的可以加我Q:<10353581>进行详细解答 叶汉的打法 ...

  7. [ASP.NET Core 3框架揭秘] 依赖注入[2]:IoC模式

    正如我们在<依赖注入:控制反转>提到过的,很多人将IoC理解为一种"面向对象的设计模式",实际上IoC不仅与面向对象没有必然的联系,它自身甚至算不上是一种设计模式.一般 ...

  8. 一起学Vue之样式绑定

    在前端开发中,设置元素的 class 列表和内联样式是基本要求.本文主要讲解Vue开发中,样式列表和内联样式的绑定,仅供学习分享使用,如果有不足之处,还请指正. 概述 Vue操作元素的 class 列 ...

  9. echart的legend不显示问题

    legend的data与series的name 两者必须同时存在,且数量和文字内容必须一致.

  10. Linux下的密码破解

    密码散列: 密码散列的$6 表示是:SHA512 这里我们使用hashcat 工具进行破解 ╰─ hashcat -m 1800 hash.txt /usr/share/wordlists/rocky ...