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. NTP服务器

    server 1.cn.pool.ntp.org server 1.asia.pool.ntp.org server 0.asia.pool.ntp.org pool.ntp.org

  2. [经典] Best Time to Buy and Sell Stock

    这一系列求最优值的问题变种挺多 1. Say you have an array for which the ith element is the price of a given stock on ...

  3. BZOJ2253 2010 Beijing wc 纸箱堆叠 CDQ分治

    这题之前度娘上没有CDQ分治做法,gerwYY出来以后写了一个.不过要sort3遍,常数很大. gerw说可以类似划分树的思想优化复杂度,但是蒟蒻目前不会划分树(会了主席树就懒得去弄了). 嗯 将me ...

  4. 初识phaser框架——开源的HTML5 2D游戏开发框架

    背景: 在网上看到,65行实现flappy bird,感到很好奇.原来是使用开源的2D游戏框架 phaser开发的. 什么是phaser2D游戏开发框架呢? 借鉴与网上的资料: 1.    Phase ...

  5. thinkphp 视图模型使用分析

    <?php /** * 视图模型 * */ class ViewBatchModel extends ViewModel{ public $viewFields = array( 'Jinxia ...

  6. [置顶] iptables 性能 测试

    一直研究iptables 性能,这几天刚好有硬件资源,于是发始下手测试iptables NAT 性…… 硬件环境  : 服务器: IBM x3650 ( 4G  E5645 6核 12线程) ESXi ...

  7. shell之“>/dev/null 2>&1” 详解(转)

    今天在自己的一个技术群中又被问道了这么一个问题,于是又通俗的解释了一下,做个记录,大家看看解释是否清楚! shell中可能经常能看到:>/dev/null 2>&1 命令的结果可以 ...

  8. Qapp使用总结

    QApp构建项目总结 1.view  module  区别

  9. linux下sed命令笔记

    sed 流编辑器 Stream EDitor三大文本处理工具:grep,sed,awk 语法:sed 'AddressCommand' file ...Address:    1,StartLine, ...

  10. hibernate中有时候复杂删除有时候可以拆分为两个语句

    这个demo是使用原生的sql语句写的,也就是没有调用我在struts中已经写好的公用类common中的增删改查功能,所以要开启事务