無法代替,也是數(shù)據(jù)庫本身的限制。
成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比南樂網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式南樂網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋南樂地區(qū)。費(fèi)用合理售后完善,十載實(shí)體公司更值得信賴。
1,oracle的rowid在普通表中是能唯一標(biāo)記一行記錄,可以快速定位。
2,在Postgresql中有一個(gè)與rowid差不多的就是oid,但這個(gè)默認(rèn)沒有的 ,要在建表的時(shí)候指定with oids才有。這個(gè)也可以唯一標(biāo)記并快速定位行記錄。
3,在GREENPLUM中,一個(gè)OID確實(shí)是可以找到多行,這是因?yàn)镚REENPLUM是由多個(gè)INSTANCE組成的。
1)查詢表中的前8條記錄
select * from area where rownum = 8
查詢結(jié)果如下:
2)查詢第2到第8條記錄
對(duì)于這種形式的查詢,oracle不像mysql那么方便,它必須使用子查詢或者是集合操作來實(shí)現(xiàn)。我們可以使用以下3種方式可以實(shí)現(xiàn):
A: select id,province,city,district from (select id,province,city,district,rownum as num from area) where num between 2 and 8;
首先根據(jù)select id,province,city,district,rownum as num from area得到一個(gè)臨時(shí)表,這個(gè)臨時(shí)表中有一個(gè)rownum列(一個(gè)偽列,類似與rowid,但又不同于rowid,因?yàn)閞owid是物理存在的一個(gè)列,也就是說Oracle數(shù)據(jù)庫中任何一個(gè)表都有一個(gè)rowid列,而rownum不是物理存在的),然后在臨時(shí)表中來查詢。
B: select * from area where rownum = 8 minus select * from area where rownum 2;
使用集合減運(yùn)算符minus,該操作返回在第一個(gè)select中出現(xiàn)而不在第二個(gè)select中出現(xiàn)的記錄。
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;
使用集合交運(yùn)算符intersect,這里繞了一個(gè)彎(不過這個(gè)彎實(shí)現(xiàn)了rownum大于某個(gè)數(shù)的查詢),它是首先利用A的方式查詢得到所有rownum大于2的記錄,然后再與rownum小于等于8的記錄集合做交運(yùn)算。三種操作得到的結(jié)果一樣,如下圖所示:
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.
因?yàn)閞ownum是根據(jù)查詢的結(jié)果集來對(duì)記錄進(jìn)行編號(hào),所以當(dāng)你查詢r(jià)ownum大于2的記錄時(shí)會(huì)得到一個(gè)空的結(jié)果集。因?yàn)楫?dāng)oracle查詢得到第1條記錄時(shí),發(fā)現(xiàn)rownum為1不滿足條件,然后就繼續(xù)查詢第2條記錄,但此時(shí)第2條記錄又被編號(hào)為1(也即rownum變?yōu)?),所以查詢得到的始終是rownum=1,因此無法滿足約束,最終查詢的結(jié)果集為空。
[2] rownum的排序查詢問題
Rownum的排序查詢是根據(jù)表中數(shù)據(jù)的初始順序來進(jìn)行的。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;
其結(jié)果如下圖所示:
發(fā)現(xiàn)沒有,它只對(duì)area表中的前8條記錄進(jìn)行排序。那么,如果我要取表中的前8條記錄并且要求是全表有序,那怎么辦呢?還是老辦法,使用子查詢。我們可以使用以下語句得到:
select * from (select * from area order by district)
where rownum = 8;
查詢的結(jié)果如下圖所示:
結(jié)束語:
Oracle中的rownum與mysql的limit實(shí)現(xiàn)的功能相同,但沒有mysql來的容易,它一般通過一個(gè)子查詢來實(shí)現(xiàn)。mysql的易用性也是它能夠縱橫開源數(shù)據(jù)庫的原因,它不像postgresql那樣的學(xué)院派,它的那種簡(jiǎn)單易用性或許在大型軟件項(xiàng)目的開發(fā)中值得借鑒。最近聽說sql server 2008也實(shí)現(xiàn)了limit的查詢,不過還沒去試過,Oracle在這方面也要加油啊,用戶容易使用才是王道