Oracle数据库之rownum
2015-06-22 22:12
567 查看
Oracle数据库之rownum
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的注意事项
不能对rownum使用>(大于1的数值)、>=(大于1的数值)、=(大于1的数值),否则无结果。
在使用rownum时,只有当Order By的字段是主键时,查询结果才会先排序再计算rownum,但是,对非主键字段(如:name)进行排序时,结果可能就混乱了。出现混乱的原因是:oracle先按物理存储位置(rowid)顺序取出满足rownum条件的记录,即物理位置上的前5条数据,然后在对这些数据按照Order By的字段进行排序,而不是我们所期望的先排序、再取特定记录数。
相关文章推荐
- 升级到Oracle DB 12c之前应该考虑的因素:DB 12c中EM Express 12c的功能减少
- oracle 数据类型详解---日期型
- Oracle数据库之PL/SQL触发器
- oracle多表查询
- LRM-00109: could not open parameter file '/u01/app/oracle/product/12.1.0/db_1/dbs/initepps.ora'
- CentOS7安装Oracle 12C
- Oracle数据库入门
- Oracle的一些基本命令
- Oracle书籍推荐
- hostname 的更改 Oracle Linux 6.5 && RHEL 7.0
- ORACLE触发特定的解释
- oracle性能优化学习062201
- Centos 7下安装Oracle 12c
- win8 64位操作系统安装Oracle11g 并配置PLSQL
- [转]一个简单的生成随机手机/电话号码/身份证号/银行卡号/地址/电子邮件等的Oracle小程序
- oracle 日志删除的方法,转于别人的文章且验证有效
- Oracle之约束
- Oracle之约束
- Oracle之约束总结
- Oracle查询大于1000条处理