- 浏览: 214930 次
- 性别:
- 来自: 天津
文章分类
最新评论
-
sun.zhang:
这个文章不错,怎么没人顶?
servlet 输出中文显示为问号"??"的解决办法 -
freeskywcy:
happy90 写道Keep-Alive 模式只要设置一下就行 ...
有关http Keep-Alive 的详细解释 -
happy90:
Keep-Alive 模式只要设置一下就行吗? 那编程的时候要 ...
有关http Keep-Alive 的详细解释
一、 Oracle中 rownum与rowid的理解 rownum,rowid都叫伪列。 但是,rownum是逻辑上的编号,且其值总是从1开始,每行的rounum不是固定的。而rowid是“物理”编号。若数据库文件没有移动,则每行的 rowid一般是固定不变的。
racle中rownum用法的总结 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<、<=、!=),并非说用>,>=,=,between..and 时会提示SQL语法错误,而是经常是查不出一条记录来,还会出现似乎是莫名其妙的结果来,其实您只要理解好了这个 rownum 伪列的意义就不应该感到惊奇,同样是伪列,rownum 与 rowid 可有些不一样,下面以例子说明 假设某个表 t1(c1) 有 20 条记录
如果用 select rownum,c1 from t1 where rownum < 10, 只要是用小于号,查出来的结果很容易地与一般理解在概念上能达成一致,应该不会有任何疑问的。
可如果用 select rownum,c1 from t1 where rownum > 10 (如果写下这样的查询语句,这时候在您的头脑中应该是想得到表中后面10条记录),你就会发现,显示出来的结果要让您失望了,也许您还会怀疑是不谁删了一些记录,然后查看记录数,仍然是 20 条啊?那问题是出在哪呢?
先好好理解 rownum 的意义吧。因为ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。简单的说 rownum 是对符合条件结果的序列号。它总是从1开始排起的。所以你选出的结果不可能没有1,而有其他大于1的值。所以您没办法期望得到下面的结果集:
11 aaaaaaaa 12 bbbbbbb 13 ccccccc .................
rownum >10 没有记录,因为第一条不满足去掉的话,第二条的ROWNUM又成了1,所以永远没有满足条件的记录。或者可以这样理解:
ROWNUM是一个序列,是oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则rownum值为1,第二条为2,依次类推。如果你用>,>=,=,between...and这些条件,因为从缓冲区或数据文件中得到的第一条记录的rownum为1,则被删除,接着取下条,可是它的rownum还是1,又被删除,依次类推,便没有了数据。
有了以上从不同方面建立起来的对 rownum 的概念,那我们可以来认识使用 rownum 的几种现像
1. select rownum,c1 from t1 where rownum != 10 为何是返回前9条数据呢?它与 select rownum,c1 from tablename where rownum < 10 返回的结果集是一样的呢? 因为是在查询到结果集后,显示完第 9 条记录后,之后的记录也都是 != 10,或者 >=10,所以只显示前面9条记录。也可以这样理解,rownum 为9后的记录的 rownum为10,因条件为 !=10,所以去掉,其后记录补上,rownum又是10,也去掉,如果下去也就只会显示前面9条记录了
2. 为什么 rownum >1 时查不到一条记录,而 rownum >0 或 rownum >=1 却总显示所以的记录 因为 rownum 是在查询到的结果集后加上去的,它总是从1开始
3. 为什么 between 1 and 10 或者 between 0 and 10 能查到结果,而用 between 2 and 10 却得不到结果 原因同上一样,因为 rownum 总是从 1 开始
从上可以看出,任何时候想把 rownum = 1 这条记录抛弃是不对的,它在结果集中是不可或缺的,少了rownum=1 就像空中楼阁一般不能存在,所以你的 rownum 条件要包含到 1
但如果就是想要用 rownum > 10 这种条件的话话就要用嵌套语句,把 rownum 先生成,然后对他进行查询。 select * from (selet rownum as rn,t1.* from a where ...) where rn >10
一般代码中对结果集进行分页就是这么干的。 另外:rowid 与 rownum 虽都被称为伪列,但它们的存在方式是不一样的,rowid 可以说是物理存在的,表示记录在表空间中的唯一位置ID,在DB中唯一。只要记录没被搬动过,rowid是不变的。rowid 相对于表来说又像表中的一般列,所以以 rowid 为条件就不会有 rownum那些情况发生。 另外还要注意:rownum不能以任何基表的名称作为前缀。 二、Oracle分页查询 /*从第1条开始,每次选N个,从第1+M个开始每次选N个*/ /**/ select t2.* from (select rid from (select r.rid, rownum linenum from (select rowid rid from tablename t [条件限制] [order by rid desc]) r WHERE rownum <= 5 [条件限制] [order by rid desc])) WHERE linenum >= 1) t1, tablename t2 where t1.rid = t2.rowid /*排序,选出来5个,分页显示,下面两为两种方法*/ select t2.* from (select rid from (select r.rid, rownum linenum, r.* from (select rowid rid, t.* from tablename t) r WHERE rownum <= 10 [条件限制] [order by rowid desc]) WHERE linenum >= 6) t1, tablename t2 where t1.rid = t2.rowid
select * from (select t.*, rownum rn from tablename t where rownum <= 10 [条件限制] [order by t.rowid desc]) where rn >= 6;
select * from tablename where rownum>1 select * from tablename where rownum>=1 select * from tablename where rownum>0 select t2.* |
发表评论
-
Oracle的EM(OracleDBConsoleorcl服务)无法启动的问题解决
2012-03-14 09:26 2828Oracle的EM(OracleDBConsoleorcl ... -
解决OracleDBConsoleorcl服务无法启动问题
2012-03-07 14:25 0Windows 不能在 本地计算机 启动 OracleDBCo ... -
oracle中的exists和not exists和in用法详解
2012-02-22 15:55 891有两个简单例子,以说明 “exists”和“in”的效率 ... -
ORACLE中字符串比较
2012-02-15 10:34 1857在oracle中,将空字符串 ... -
oracle 重复数据的分情况删除
2012-02-14 10:21 850Oracle认证:数据库重 ... -
char varchar varchar2 的区别
2011-12-26 16:04 914char varchar varchar2 的区别 ... -
ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 的解决方法
2011-12-23 12:26 1013早上同事用PL/SQL连接 ... -
详解查看Oracle用户权限的七种方法
2011-12-23 11:32 762查看Oracle用户权限一般要通过一些实际 ... -
Oracle中TO_DATE格式
2011-12-09 08:57 676TO_DATE格式(以时间:2007-1 ... -
Oracle sys和system用户、sysdba 和sysoper系统权限、sysdba和dba角色的区别
2011-12-07 16:14 974转自:http://blog.csdn.net/wh62 ... -
一个修改Oracle用户密码的小诀窍
2011-12-03 16:34 1656有时候我们可能不知道一个用户的密码,但是又需要以这个用户做一 ... -
(oracle)只有 DBA 才能导入由其他 DBA 导出的文件
2011-11-29 14:29 1564连接到: Oracle Database 10g Enterp ... -
oracle定时任务(dbms_job)
2011-11-15 08:57 756原文地址:http://publish.it168.com/2 ... -
oracle中的tnsname.ora 参数解释
2011-10-20 09:36 1631可以在客户端机器上使 ... -
不安装Oracle客户端远程连接Orcale数据库
2011-10-20 09:36 1831第一种方法: 最近有 ... -
PLSQL 连接远程的ORACLE数据库解决方案
2011-10-20 09:36 1112PLSQL Developer连接远程的ORACLE数 ... -
oracle 常用函数nvl decode userenv greatest least
2011-10-10 15:04 1407如下3个函数,分别用新内容代替字段的空值://比如说用其他 ... -
to_char 和to_date的说明
2011-10-10 15:05 855to_char DATE 类型转换为 VARCHAR2 t ... -
To_Date函数用法
2011-10-09 15:11 1372To_Date函数用法 spl>select ... -
Oracle中dual的意思
2011-10-09 14:47 1364这是个虚拟表,在操作 ...
相关推荐
Oracle学习笔记(rownum和rowid),有具体的代码案例讲解rownum和rowid
举例介绍在oracle中rownum和rowId的不同以及使用方法
本文主要是以实例形式介绍了Oracle查询中rownum与rowid的不同之处,以及以假设的方式为例,查询条件为rownum = 2,在查询出第一条记录时的具体内容的介绍。 在查询中,我们可以注意到,类似于 select xx from ...
oracle_SQL中rowid与rownum的使用
oracle_SQL中ROWID与ROWNUM的使用 很有用哦
oracle 分页查询 使用ROWNUM技巧及陷阱
oracle 数据库 rowid与rownum的使用
=),并非说用>,>=,=,between..and 时会提示SQL语法错误,而是经常是查不出一条记录来,还会出现似乎是莫名其妙的结果来,其实您只要理解好了这个 rownum 伪列的意义就不应该感到惊奇,同样是伪列,rownum 与 rowid ...
ORACLE 中ROWNUM用法总结 整理版本,详细明了
oracle_SQL中 rowid 和rownum的使用
Oracle中rownum的使用
ORACLE 中ROWNUM用法总结!数据库管理员及程序开发员必看。
写好oracle的连接字符串和查询语句,调用程序中的方法可以很方便的实现分页功能。该方法中,将参数连接字符串,查询的sql语句,指定每页显示多少行,调用成功后,会返回页数,行数,还有查询的结果数据集。 使用...
oracle rowid rownum 等组成原理
oracle rownum和distinct
在MySQL中,我们通常都使用limit来完成数据集获取的分页操作,而在Oracle数据库中,并没有类似limit一样的方便方法来实现分页,因此我们通常都是直接在SQL语句中完成分页,这里就需要借助于rownum伪列或row_number()...
sql语句中select top n与oracle的rownum与mysql的limit 取前几条数据sql简单用法
select * from (select a.*,rownum rn from (select * from tablename) a where rownum) where rn>2