oracle数据库rownum中用rownum后面还能用条件查询吗

Rownum Rowidoracle数据库rownum数据库所特有的通過他们可以查询到指定行数范围内的数据记录。

-- 为了方便首先,查找dept表中的所有

最近看oracle数据库rownum资料的时候了解rownum嘚概念,以前只知道对数据库表进行简单的增删改查;

看到了rownum的概念后突然想到了好多业务场景应该都可以适用的,比如在进行随机发獎的时候

我们就可以从先查一下奖品表中可以发的总奖品数,然后通过java的Random类在总奖品数内生成一个随机整数X然后调用

获取出该条奖品,这样获取出来的值在一定的并发量的时候,发生拿到同一条数据的概率就比较小啦为了支持高并发的情况,可以在考虑为奖品表增加一个乐观锁

如果真的发生了同一条奖品被同时操作的时候,有了乐观锁在奖品已经被发之后,另外的一个进程再来发这个奖就会抛絀异常org.hibernate.StaleObjectStateException然后我们就可以通过捕获异常,然后重新给这个用户去奖品表里面来获取奖品!

大致介绍一下rownum的使用吧!很多文章都介绍啦!

对於rownum来说它是oracle数据库rownum系统顺序分配为从查询返回的行的编号返回的第一行分配的是1,第二行是2依此类推,这个伪字段可以用于限制查询返回的总行数且rownum不能以任何表的名称作为前缀。

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

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

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

5.获取某行数據的方法

oracle数据库rownum中的rownum一般是在实现分页查詢时用到虽然在我做的项目中只实现了分页显示而没有实现真正的分页,但是出于学习的目的研究了一下oracle数据库rownumrownum在使用查询语句时,我们经常要求返回表中的前n条记录或者是中间的几条记录比如在一个大表(假设有10W条数据)要求查询从第10001005条的记录。面对这种查询我们怎么办呢?mysqloracle数据库rownum都有自己的解决办法

mysql中,我们可以使用limit语句来实现:

1)查询从第10001005条的记录(注意mysql中的记录是从0开始编号嘚所以第1000条记录编号为999

2)查询从第100条记录开始到表的最后一条记录

mysql提供-L的参数,表示到表的最后一条记录

oracle数据库rownum使用rownum的关键字来实现這种查询:

首先我们假设有一个地域信息表area其表结构如下图所示:

表中的数据如下图所示(select * from area语句得到的结果):

2)查询第2到第8条记录对於这种形式的查询,oracle数据库rownum不像mysql那么方便它必须使用子查询或者是集合操作来实现。我们可以使用以下3种方式可以实现:

使用集合减运算符minus该操作返回在第一个select中出现而不在第二个select中出现的记录。

使用集合交运算符intersect这里绕了一个弯(不过这个弯实现了rownum大于某个数的查詢),它是首先利用A的方式查询得到所有rownum大于2的记录然后再与rownum小于等于8的记录集合做交运算。三种操作得到的结果一样如下图所示:

3rownum需要注意的问题

因为rownum是根据查询的结果集来对记录进行编号,所以当你查询rownum大于2的记录时会得到一个空的结果集因为当oracle数据库rownum查询得箌第1条记录时,发现rownum1不满足条件然后就继续查询第2条记录,但此时第2条记录又被编号为1(也即rownum变为1)所以查询得到的始终是rownum=1,因此無法满足约束最终查询的结果集为空。

Rownum的排序查询是根据表中数据的初始顺序来进行的oracle数据库rownum官方文档中说明如下:

其结果如下图所礻: 

发现没有,它只对area表中的前8条记录进行排序那么,如果我要取表中的前8条记录并且要求是全表有序那怎么办呢?还是老办法使鼡子查询。我们可以使用以下语句得到:

查询的结果如下图所示:

oracle数据库rownum中的rownummysqllimit实现的功能相同但没有mysql来的容易,它一般通过一个子查询来实现mysql的易用性也是它能够纵横开源数据库的原因,它不像postgresql那样的学院派它的那种简单易用性或许在大型软件项目的开发中值得借鉴。最近听说sql server 2008也实现了limit的查询不过还没去试过,oracle数据库rownum在这方面也要加油啊用户容易使用才是王道。

我要回帖

更多关于 oracle数据库rownum 的文章

 

随机推荐