成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Oracle中查詢rownum和rowid的區別

數據庫 Oracle 數據庫運維
在Oracle中,有一個很有趣的東西,那就是rownum。當你從某個表中查詢數據的時候,返回的結果集中都會帶有rownum這個字段,而且有時候也可以使用rownum進行一些條件查詢。

在查詢中,我們可以注意到,類似于“select xx from table where rownum < n”(n>1)這樣的查詢是有正確含義的,而“select xx from table where rownum = n”這樣的查詢只在n=1的時候成立,“select xx from table where rownum > n”(n>1)這樣的查詢只能得到一個空集。另外“select xx from table where rownum > 0”這個查詢會返回所有的記錄。這是為什么呢?原因就在于Oracle對rownum的處理上,rownum是在得到結果集的時候產生的,用于標記結果集中結果順序的一個字段,這個字段被稱為“偽數列”,也就是事實上不存在的一個數列。它的特點是按順序標記,而且是逐次遞加的,換句話說就是只有有rownum=1的記錄,才可能有rownum=2的記錄。

讓我們回頭來分析一下在where中使用rownum作為查詢條件的情況。在rownum取=1,或者rownum <= n (n>1)的時候,沒有問題。那么為什么當條件為rownum = n或者rownum >= n時明明有數據卻只能得到一個空集呢?假設我們的查詢條件為rownum = 2,那么在查詢出的***條記錄的時候,oracle標記此條記錄rownum為1,結果發現和rownum=2的條件不符,于是結果集為空。寫到這里,我忽然有一個有趣的想法:假如有一條查詢語句為select xx,yy from table where zz > 20 and rownum < 10,那么在執行的時候,是先按照zz>20的條件查詢出一個結果集,然后按照rownum取出前10條返回?還是在按照zz>20的條件先查詢,然后有一個記錄就標記一個rownum,到rownum<10的時候就停止查詢?我覺得應該是后者,也就是在執行語句的時候,不是做full scan,而是取夠數據就停止查詢。要驗證這個想法應該很簡單,找一個數據量非常大的表進行查詢就可以了。可惜目前我沒有這樣的表。

我們可以看出,直接使用rownum是要受到限制的。但是很容易遇到這樣的需求“查出符合條件的第xx條到第xx條記錄”,比如頁面的分頁處理。這個時候如何構造出適合自己的結果集?嗯,墻邊那位說全取出來手工挑選的哥們可以拉出去了。當然這樣做也是可以的,但是前提是整個數據集的數據條數不多的情況下。假如遇到上十萬百條的數據,全部取出來的話,用戶就不用干別的事情了。這個時候用戶應該怎么做呢?當然就是要用到我們介紹的rownum拉!rownum不是個“偽數列”么,好說,我們現在把它弄成一個實在的字段就可以了。

具體做法就是利用子查詢,在構建臨時表的時候,把rownum也一起構造進去。比如“select xx,yy from (select xx,yy,rownum as xyz from table where zz >20) where xyz between 10 and 20”這樣就可以了。另外使用oracle提供的結果集處理函數minus也可以做到,例如“select xx,yy from table where zz > 20 and rownum <20 minus select xx,yy from table where zz>20 and rownum <10”,但是使用minus好像比使用子查詢更加消耗資源。

和rownum相似,oracle還提供了另外一個偽數列:rowid。不過rowid和rownum不同,一般說來每一行數據對應的rowid是固定而且***的,在這一行數據存入數據庫的時候就確定了。可以利用rowid來查詢記錄,而且通過rowid查詢記錄是查詢速度最快的查詢方法。(這個我沒有試過,另外要記住一個長度在18位,而且沒有太明顯規律的字符串是一個很困難的事情,所以我個人認為利用rowid查詢記錄的實用性不是很大)rowid只有在表發生移動(比如表空間變化,數據導入/導出以后),才會發生變化。

【編輯推薦】

  1. 巧用dbms_rowid包獲得rowid的詳細信息
  2. 淺析Oracle中的表空間查詢方法
  3. Oracle數據庫中的字符處理技巧
責任編輯:彭凡 來源: 51CTO博客
相關推薦

2010-04-08 11:11:16

Oracle查詢

2011-05-19 14:29:49

Oraclerownum

2010-04-16 16:41:53

rownum用法

2011-04-12 11:32:31

Oraclerownum用法

2010-10-27 11:25:13

ORACLE ROWN

2010-04-29 16:06:47

Oracle rown

2009-11-19 16:27:23

Oracle Rown

2010-05-07 18:52:59

Oracle rown

2010-04-23 14:18:38

Oracle ROWI

2011-05-20 13:34:35

Oracledbasysdba

2010-10-25 13:48:26

Oracle過程

2011-05-16 13:40:35

dbasysdba

2010-10-28 11:36:16

Oracle用戶

2010-10-19 13:52:28

SQL Server事

2010-09-24 18:03:38

SQL中EXISTS

2010-11-16 15:40:21

oracle游標

2010-04-16 11:32:29

PGA和UGA

2018-01-25 12:50:33

數據庫OracleROWNUM

2010-09-24 17:39:28

SQL中EXISTS

2010-11-29 11:27:08

oracle創建存儲過
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久精品在线免费视频 | 欧美一区免费 | 一级片免费观看 | 国产精品永久在线观看 | 天天综合日日夜夜 | 亚洲一区二区中文字幕在线观看 | 久久久久久久久久一区 | 亚洲国产aⅴ成人精品无吗 国产精品永久在线观看 | 日批日韩在线观看 | 精品国产乱码久久久久久闺蜜 | 一区二区三区中文字幕 | 久久草在线视频 | 精品一二 | 九九在线精品视频 | 在线免费av观看 | se婷婷| 久久精品视频在线观看 | 一级毛片在线播放 | 超碰97人人人人人蜜桃 | 亚洲精品电影 | 欧美日韩在线电影 | 国产精品一区二区三区在线 | 麻豆av网站 | 久久久久国产精品一区二区 | 性色av网站 | 国产精品日日做人人爱 | 久久777| 日韩中文字幕一区 | 日韩精品免费在线 | 精品一区二区三区在线观看国产 | 亚洲一区二区免费看 | 99资源站| 亚洲免费人成在线视频观看 | 91原创视频| 99pao成人国产永久免费视频 | 国产精品日日做人人爱 | 人人人人爽| av一区二区在线观看 | 成人亚洲综合 | 99精品欧美一区二区三区综合在线 | 中文字幕国产一区 |