1. 介绍

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

Oracle提供了一个rownum的伪列,它会根据返回记录生成一个序列化的数字。

rownum和rowid都是伪列,但是两者的根本是不同的。rownum是根据SQL查询出的结果给每行分配一个逻辑编号,所以SQL不同也就会导致最终rownum不同;rowid是物理结构上的,在每条记录INSERT到数据库中时,都会有一个唯一的物理记录。

2. 限定查询行数

如果希望限定查询结果集的前几条数据,通过ROWNUM可以轻松实现。

示例:

-- 查找前三条员工的记录
SELECT * FROM employee WHERE rownum <= 3;

3. 分页查询

在数据库应用系统中,我们会经常使用到分页功能,如每页显示5条记录,查询第2页内容该如何查询呢?

SELECT * FROM employee WHERE rownum > 5 AND rownum <= 10;

上面的SQL语句是否能查询出我们想要的结果呢?

当执行该SQL就会发现,显示出来的结果要让你失望了:查不出一条记录,即使表中有20条记录。问题是出在哪呢?

因为rownum是对结果集加的一个伪列(即先查到结果集之后再加上去的一个列),简单的说rownum是对符合条件结果集添加的序列号。它总是从1开始排起的,所以选出的结果中不可能没有1,而有其他大于1的值。

rownum > 5 AND rownum <= 10 查询不到记录,因为如果第一条的 rownum = 1,不满足条件被去掉,第二条的rownum又成了1,继续判断,所以永远没有满足条件的记录。

任何时候想把 rownum = 1 这条记录抛弃是不对的,它在结果集中是不可或缺的,少了rownum=1 就像空中楼阁一般不能存在,所以你的 rownum 条件要包含到 1。

那么,如果想要用 rownum > 5 这种条件的话就要用子查询,把rownum先生成,然后再对生成结果进行查询。

示例:

SELECT * FROM (
SELECT e.*, rownum r FROM employee WHERE rownum <= 10
) t WHERE t.r > 5;

4. 使用rownum的注意事项

  1. 不能对rownum使用>(大于1的数值)、>=(大于1的数值)、=(大于1的数值),否则无结果。
  2. 在使用rownum时,只有当Order By的字段是主键时,查询结果才会先排序再计算rownum,但是,对非主键字段(如:name)进行排序时,结果可能就混乱了。出现混乱的原因是:oracle先按物理存储位置(rowid)顺序取出满足rownum条件的记录,即物理位置上的前5条数据,然后在对这些数据按照Order By的字段进行排序,而不是我们所期望的先排序、再取特定记录数。

Oracle数据库之rownum的更多相关文章

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

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

  2. 关于Oracle数据库的rownum应用

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

  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. Linux下的各种软件安装方法汇总

    1 RPM包 1.1 安装 RPM包就像Windows的EXE安装文件一样,各种文件都已经编译好了,并进行了打包,哪一个文件应该放在哪一个目录下都指定好了,安装非常方便,在图形界面里你只需要双击就能自 ...

  2. word中MathType公式不能 二次编辑解决方案

    问题:当新建文档然后插入公式,此时可以利用mathtype进行编辑,保存后推出第二次打开,双击公式却发现不能编辑公式. 解决方案: ////////////////////////////////// ...

  3. Java基础(三)

    这里有我之前上课总结的一些知识点以及代码大部分是老师讲的笔记 个人认为是非常好的,,也是比较经典的内容,真诚的希望这些对于那些想学习的人有所帮助! 由于代码是分模块的上传非常的不便.也比较多,讲的也是 ...

  4. 换成gnome3桌面后国际版qq不能输入中文问题

    困扰了好久的问题今天终于解决了,网上也没有完整的教程,所以在这里整理下 前几天给自己的ubuntu装上了gnome桌面,一切都挺正常的,桌面很炫,用着也很舒服,不过之前的qq却没办法输入中文了,下面我 ...

  5. HDOJ 1716 排列2(next_permutation函数)

    Problem Description Ray又对数字的列产生了兴趣: 现有四张卡片,用这四张卡片能排列出很多不同的4位数,要求按从小到大的顺序输出这些4位数. Input 每组数据占一行,代表四张卡 ...

  6. JavaScript高级程序设计10.pdf

    String类型有几种操作字符串的方法 concat()方法拼接任意多个字符串,不修改原字符串 var stringValue=“hello ”; var result=stringValue.con ...

  7. Java IO复习 UDP

    客户端: package cn.zyw.javaurl; import java.io.IOException; import java.net.*; /** * Created by zyw on ...

  8. Day 16: Goose Extractor —— 好用的文章提取工具

    Day 16: Goose Extractor -- 好用的文章提取工具 Day 16: Goose Extractor -- 好用的文章提取工具

  9. Oracle Hint 详解

    Hint 是Oracle 提供的一种SQL语法,它允许用户在SQL语句中插入相关的语法,从而影响SQL的执行方式. 因为Hint的特殊作用,所以对于开发人员不应该在代码中使用它,Hint 更像是Ora ...

  10. c#基础语言编程-多态

    语言中的多态性是为了使程序有扩展性,为实现多态性,在程序中体现为接口.抽象类.父类.具体类. 接口就是一种规范,解决了多重继承的问题,类似一种规范,告诉我要做什么,具有什么能力,在接口中定义写行为属性 ...