oracle中间结果,Oracle中的实现中间的某一区间记录查询(方法:rownum)

Oracle使用rownum的关键字来实现这种查询:

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

a4c26d1e5885305701be709a3d33442f.png

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

a4c26d1e5885305701be709a3d33442f.png

1)查询表中的前8条记录select * from area where

rownum <= 8查询结果如下:

a4c26d1e5885305701be709a3d33442f.png

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

A:select id,province,city,district from

(select id,province,city,district,rownum as num from area) where

num between 2 and 8;

首先根据select id,province,city,district,rownum as num

from area得到一个临时表,这个临时表中有一个rownum列(一个伪列,类似与rowid,但又不同于rowid,因为rowid是物理存在的一个列,也就是说Oracle数据库中任何一个表都有一个rowid列,而rownum不是物理存在的),然后在临时表中来查询。

B:select * from area where rownum

<= 8 minus select * from area where rownum <

2;

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

C:select id,province,city,district

from (select id,province,city,district,rownum as num from area)

where num >=2

intersect

select * from area where rownum <= 8;

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

a4c26d1e5885305701be709a3d33442f.png

3)rownum需要注意的问题

[1] rownum不支持以下方式的查询

a:select * from area where rownum >

2;

b:select * from area where rownum =

n; --where n is a integer number

lager than 1

注:rownum只支持select * from area where rownum

=1的查询。Oracle的官方文档说明如下:

Conditions testing for ROWNUM values greater than a positive

integer are always false.

For example, this query returns no rows:

SELECT * FROM employees

WHERE ROWNUM > 1;

The first row fetched is assigned a ROWNUM of 1 and makes the

condition false. The

second row to be fetched is now the first row and is also

assigned a ROWNUM of 1 and

makes the condition false. All rows subsequently fail to

satisfy the condition, so no

rows are returned.

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

[2] rownum的排序查询问题

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

If an ORDER BY clause follows ROWNUM in the same query, then

the rows will be

reordered by the ORDER BY clause. The results can vary

depending on the way the

rows are accessed. For example, if the ORDER BY clause causes

Oracle to use an index

to access the data, then Oracle may retrieve the rows in a

different order than without

the index.

例如:select

* from area where rownum <= 8 order by

district;

其结果如下图所示:

a4c26d1e5885305701be709a3d33442f.png

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

select * from (select * from area order by

district)

where rownum <= 8;

查询的结果如下图所示:

a4c26d1e5885305701be709a3d33442f.png

原方转自:

  • 0
    点赞
  • 0
    收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页
评论
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值