`
小鑫的java
  • 浏览: 143106 次
  • 性别: Icon_minigender_1
  • 来自: 浙江
社区版块
存档分类
最新评论

SQL_oracle_rownum介绍

    博客分类:
  • SQL
阅读更多

rownum介绍:
http://hi.baidu.com/radioxhk/blog/item/25663526a5f69d138a82a1bb.html

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

另外还要注意:rownum不能以任何基表的名称作为前缀。


对于下面的SQL语句

SQL>select rownum,id,age,name from loaddata where rownum > 2;

    ROWNUM ID     AGE NAME
    -------       ------    ---   ------

rownum>2没有记录,因为第一条不满足去掉的话,第二条的rownum 又成了1,依此类推,所以永远没有满足条件的记录。或者可以这样理解:rownum是一个序列,是oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则rownum值为1,第二条为2,依次类推。如果你>,>=,=,between...and这些条件,因为从缓冲区或数据文件中得到的第一条记录的rownum为1,不符合sql语句的条件,则被删除,接着取下条,可是它的rownum还是1,又被删除,依次类推,便没有了数据。


有了以上从不同方面建立起来的对rownum的概念,那我们可以来认识使用rownum的几种现象:

(1)select rownum,id,age,name from loaddata where rownum != 10 为何是返回前9条数据呢?它与 select rownum,id,age,name from loaddata 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实际运用的例子:

sql建表脚本
create table LOADDATA
(
ID   VARCHAR2(50),
AGE VARCHAR2(50),
NAME VARCHAR2(50)
)
tablespace SYSTEM
pctfree 10
pctused 40
initrans 1
maxtrans 255
storage
(
    initial 64K
    minextents 1
    maxextents unlimited
);


(1) rownum 对于等于某值的查询条件

如果希望找到loaddata表中第一条记录的信息,可以使用rownum=1作为条件。
但是想找到loaddata表中第二条记录的信息,使用rownum=2结果查不到数据。
因为rownum都是从1开始,但是1以上的自然数在rownum做等于判断是时认为都是false条件,所以无法查到rownum = n(n>1的自然数)。
select rownum,id,age,name from loaddata where rownum = 1;(可以用在限制返回记录条数的地方,保证不出错,如:隐式游标)

SQL>select rownum,id,age,name from loaddata where rownum = 1;
    ROWNUM ID     AGE NAME
    ------- ------ --- ------
         1 200001 22   AAA

SQL>select rownum,id,age,name from loaddata where rownum = 2;
    ROWNUM ID     AGE NAME
    ------- ------ --- ------

注:
SQL>select rownum,id,age,name from loaddata where rownum != 3; 返回的是前2条记录。
  
    ROWNUM ID     AGE NAME
    ------- ------ --- ------
         1 200001 22   AAA
         2 200002 22 BBB


(2)rownum对于大于某值的查询条件

   如果想找到从第二行记录以后的记录,当使用rownum>2是查不出记录的,原因是由于rownum是一个总是从1开始的伪列,Oracle 认为rownum> n(n>1的自然数)这种条件依旧不成立,所以查不到记录。

SQL>select rownum,id,age,name from loaddata where rownum > 2;

    ROWNUM ID     AGE NAME
    ------- ------ --- ------
那如何才能找到第二行以后的记录呀。可以使用以下的子查询方法来解决。注意子查询中的rownum必须要有别名,否则还是不会查出记录来,这是因为rownum不是某个表的列,如果不起别名的话,无法知道rownum是子查询的列还是主查询的列。

SQL>select rownum,id,age,name from(select rownum no ,id,age,name from loaddata) where no > 2;

     ROWNUM ID     AGE NAME
     ------- ------ --- ------
         3 200003 22   CCC
         4 200004 22 DDD
         5 200005 22   EEE
6 200006 22   AAA

SQL>select * from(select rownum,id,age,name from loaddata) where rownum > 2;

     ROWNUM ID     AGE NAME
     ------- ------ --- ------


(3)rownum对于小于某值的查询条件

如果想找到第三条记录以前的记录,当使用rownum<3是能得到两条记录的。显然rownum对于rownum<n((n>1的自然数)的条件认为是成立的,所以可以找到记录。
SQL> select rownum,id,age,name from loaddata where rownum < 3;

     ROWNUM ID     AGE NAME
     ------- ------ --- ------
         1 200001 22   AAA
         2 200002 22 BBB

综上几种情况,可能有时候需要查询rownum在某区间的数据,从上可以看出rownum对小于某值的查询条件是人为true的,rownum对于大于某值的查询条件直接认为是false的,但是可以间接的让它转为认为是true的。那就必须使用子查询。例如要查询rownum在第二行到第三行之间的数据,包括第二行和第三行数据,那么我们只能写以下语句,先让它返回小于等于三的记录行,然后在主查询中判断新的rownum的别名列大于等于二的记录行。但是这样的操作会在大数据集中影响速度。

SQL>select * from (select rownum no,id,age,name from loaddata where rownum <= 3 ) where no >= 2;(必须是里小外大)

     ROWNUM ID     AGE NAME
     ------- ------ --- ------
         2 200002 22 BBB
         3 200003 22   CCC

也可以用这种方法实现:

SQL>select rownum,id,age,name from loaddata where rownum < 4
minus
select rownum,id,age,name from loaddata where rownum < 2

     ROWNUM ID     AGE NAME
     ------- ------ --- ------
         2 200002 22 BBB
         3 200003 22   CCC


(4)rownum和排序

Oracle中的rownum的是在取数据的时候产生的序号,所以想对指定排序的数据去指定的rowmun行数据就必须注意了。

前提条件:loaddata表中已经insert了5条记录,最后一条记录id是200005,接着insert into loaddata values('200006','22','AAA');

SQL>select rownum,id,age,name from loaddata;
     ROWNUM ID     AGE NAME
     ------- ------ --- ------
         1 200001 22   AAA
         2 200002 22   BBB
         3 200003 22   CCC
         4 200004 22 DDD
         5 200005 22   EEE
         6 200006 22   AAA

SQL>select rownum ,id,age,name from loaddata order by name;
     ROWNUM ID     AGE NAME
     ------- ------ --- ------
         1 200001 22   AAA
         6 200006 22   AAA
         2 200002 22   BBB
         3 200003 22   CCC
         4 200004 22   DDD
         5 200005 22   EEE
可以看出,rownum并不是按照name列来生成的序号。系统是按照记录插入时的顺序给记录排的号,rowid也是顺序分配的。为了解决这个问题,必须使用子查询

SQL>select rownum ,id,age,name from (select * from loaddata order by name);
     ROWNUM ID     AGE NAME
     ------- ------ --- ------
         1 200001 22   AAA
         2 200006 22   AAA
         3 200002 22   BBB
         4 200003 22   CCC
         5 200004 22   DDD
         6 200005 22   EEE
这样就成了按name排序,并且用rownum标出正确序号(有小到大),对于大数据量的时候,建议在order by 的字段上加主键或索引这样效率会提高很多.


同样,返回中间的记录集:

SQL>select * from ( select rownum ro,id,age,name from loaddata where rownum < 5 order by name ) where ro > 2 (先选再排序再选)

ROWNUM ID     AGE NAME
     ------- ------ --- ------
         3 200002 22 BBB
         4 200003 22   CCC

分享到:
评论

相关推荐

    oracle_SQL-rowid--rownum.zip_oracle

    oracle_SQL中 rowid 和rownum的使用

    oracle_SQL中rowid与rownum的使用

    oracle_SQL中rowid与rownum的使用

    oracle_SQL中ROWID与ROWNUM的使用

    oracle_SQL中ROWID与ROWNUM的使用 很有用哦

    oracle rownum 的使用 和sqlserver有区别的!

    oracle 的rownum和咱们平时用的sqlserver的区别,其中好多的不一样!

    Oracle-SQL基础到存储过程下载(第二阶段)

    025.sql高级查询_关联之oracle特有写法.mp4 026.sql基础练习_经典18题.mp4 027.sql高级查询_伪列rowid.mp4 028.sql高级查询_伪列rownum.mp4 029.sql函数_字符函数.mp4 030.sql函数_数字函数.mp4 031.sql函数_日期...

    对于 Oracle 的 rownum 问题

    =),并非说用&gt;,&gt;=,=,between..and 时会提示SQL语法错误,而是经常是查不出一条记录来,还会出现似乎是莫名其妙的结果来,其实您只要理解好了这个 rownum 伪列的意义就不应该感到惊奇,同样是伪列,rownum 与 rowid ...

    sql语句中select top n与oracle的rownum与mysql的limit用法

    sql语句中select top n与oracle的rownum与mysql的limit 取前几条数据sql简单用法

    高性能动态SQL Oracle数据安全 Oracle 数据库的聚簇技术 等等

    Oracle查询中rownum与Order by查询 45 oracle9i小结 46 Oracle 数据库的聚簇技术 61 数据库、服务名、实例 63 Oracle内存结构 64 sys用户和system用户 67 Oracle SQL语句 67 GROUPING SETS分组 74 Oracle外部程序...

    oracle与SQL server的语法差异总结

    Oracle与SQL Server应用差异对比分析在Oracle中采用伪列rownum 获取结果集中排在前面的部分记录 Eg: 返回结果集中前10条记录 Select * from sysc01 where rownum Rownum可使用&lt;、符号,不可使用&gt;、&gt;=符号,如果使用...

    自定义sql导出报表工具,最大支持100w条数据

    自定义sql导出报表工具,最大支持100w条数。 \WEB-INF\classes\properties目录下db.properties修改oracle...sql必须包含rownum rownum_ 如 select rownum rownum_ ,t.* from user t;如果想要源码或者mysql版本,联系我

    oracle 使用rownum的三种分页方式

    rownum是Oracle数据库中的一个特有关键字,返回的是一个数字代表记录的行号。 基础知识:rownum只能做&lt;或者&lt;=的条件查询,如果要rownum进行51到100这样的范围判断,需要先查询出每一行的rownum,再用那个序号...

    Oracle中使用Rownum分页详细例子

    在MySQL中,我们通常都使用limit来完成数据集获取的分页操作,而在Oracle数据库中,并没有类似limit一样的方便方法来实现分页,因此我们通常都是直接在SQL语句中完成分页,这里就需要借助于rownum伪列或row_number()...

    Oracle高级sql学习与练习

    8、ROWNUM-TOP-N分析 9、相关子查询和非相关子查询 10、增强GROUP BY 11、分析函数(ANALYTICAL FUNCTIONS) 12、ROWID的使用 13、ORACLE 10G正则表达式 14、使用HINT 15、PARITION分区 16、并行操作 17、扩展DDL和...

    SQL语句生成及分析器(中文绿色)

    3.1.2 特殊语法,记录条数限定Top(MS_SQL),Rownum(Oracle), Limit(MySQL),Set RowCount(Sybase)) 3.1.3 字段表达式或者计算字段 3.2 选择表 (From) 3.3 条件筛选 (Where) 3.4 分组 (Group By) 3.5 组内...

    C# C/S模式的底层连线,支持SQL Server,Oracle

    string strSQL = "SELECT * FROM DA_FDC WHERE ROWNUM = 1"; DataSet ds = db.ExecuteDataset("oracleConn", strSQL); dataGridView1.DataSource = ds.Tables[0]; DataTable dt = db.Query("oracleConn", ...

    oracle中rownum和row_number()

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

    Oracle数据库、SQL

    一、 数据库介绍 1 1.1表是数据库中存储数据的基本单位 1 1.2数据库标准语言 1 1.3数据库(DB) 1 1.4数据库种类 1 1.5数据库中如何定义表 1 1.6 create database dbname的含义 1 1.7安装DBMS 1 1.8宏观上是数据--&gt;...

    oracle的rownum深入解析

    本人最近在使用oracle的rownum实现分页显示的时候,对rownum做了进一步的分析和研究。现归纳如下,希望能给大家带来收获。 对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第...

    PostgreSQL rownum实现方法(兼容oracle)

    oracle中的rownum是一个虚拟列,每输出一行递增1。但是在pg中目前没有rownum虚拟列,那么如果从oracle迁移到pg该如何实现呢? 要在pg中实现rownum我们得先...SQL&gt; select * from t1 where rownum=1; ID ---------- 1

Global site tag (gtag.js) - Google Analytics