亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Oracle查詢語句中rownum與rowid的不同之處分析

 更新時間:2014年07月30日 15:36:23   投稿:shichen2014  
這篇文章主要介紹了Oracle查詢語句中rownum與rowid的不同之處分析,需要的朋友可以參考下

本文主要是以實例形式介紹了Oracle查詢中rownum與rowid的不同之處,以及以假設的方式為例,查詢條件為rownum = 2,在查詢出第一條記錄時的具體內容的介紹。

在查詢中,我們可以注意到,類似于

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作為Oracle查詢條件的情況。在取rownum=1,或者rownum <= n (n>1)的時候,沒有問題。那么為什么當條件為rownum = n或者rownum >= n時明明有數據卻只能得到一個空集呢?假設我們的查詢條件為rownum = 2,那么在查詢出的第一條記錄的時候,Oracle標記此條記錄rownum為1,結果發(fā)現和rownum=2的條件不符,于是結果集為空。
假如有一條查詢語句為

select xx,yy from table where zz > 20 and rownum < 10

那么在執(zhí)行的時候,是先按照zz>20的條件查詢出一個結果集,然后按照rownum取出前10條返回?還是在按照zz>20的條件先查詢,然后有一個記錄就標記一個rownum,到rownum<10的時候就停止查詢?個人感覺應該是后者,也就是在執(zhí)行語句的時候,不是做full scan,而是取夠數據就停止查詢。
要驗證這個想法應該很簡單,找一個數據量非常大的表進行Oracle查詢就可以了??上壳拔覜]有這樣的表,有條件的讀者可以自己測試一下。

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

具體做法就是利用子Oracle查詢,在構建臨時表的時候,把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是固定而且唯一的,在這一行數據存入數據庫的時候就確定了??梢岳胷owid來查詢記錄,而且通過rowidOracle查詢記錄是查詢速度最快的查詢方法。

對于這個我沒有試過,另外要記住一個長度在18位,而且沒有太明顯規(guī)律的字符串是一個很困難的事情,所以我個人認為利用rowid查詢記錄的實用性不是很大。此外rowid只有在表發(fā)生移動(比如表空間變化,數據導入/導出以后),才會發(fā)生變化。

相關文章

  • 使用Navicat Premium工具將oracle數據庫遷移到MySQL

    使用Navicat Premium工具將oracle數據庫遷移到MySQL

    最近的業(yè)務項目需求,因此總結遇到的問題。使用Navicat Premium工具將Oralce數據庫遷移到MySQL,本文通過圖文的形式給大家詳細介紹,感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • Oracle同步數據到kafka的方法

    Oracle同步數據到kafka的方法

    本文主要介紹如何使用kafka-connect-oracle開源工具,將Oracle?dml產生的數據實時同步至kafka,供kafka消費,對Oracle同步數據到kafka的方法感興趣的朋友一起看看吧
    2022-02-02
  • oracle中ORA-12514問題解決方法

    oracle中ORA-12514問題解決方法

    安裝了Oracle數據庫,以前都是安裝好就可以連接了,可是今天出現了一點小意外,遇到ORA-12514錯誤問題,今天就來介紹一下解決方法,感興趣的可以了解一下
    2023-05-05
  • 檢測oracle數據庫壞塊的方法

    檢測oracle數據庫壞塊的方法

    這篇文章主要介紹了檢測oracle數據庫壞塊的方法 的相關資料,非常不錯具有參考借鑒價值,需要的朋友可以參考下
    2016-05-05
  • Oracle minus用法詳解及應用實例

    Oracle minus用法詳解及應用實例

    這篇文章主要介紹了Oracle minus用法詳解及應用實例的相關資料,這里對oracle minus的用法進行了具體實例詳解,需要的朋友可以參考下
    2017-01-01
  • oracle快速刪除重復的記錄

    oracle快速刪除重復的記錄

    oracle快速刪除重復的記錄...
    2007-03-03
  • Oracle行級觸發(fā)器的使用操作

    Oracle行級觸發(fā)器的使用操作

    這篇文章主要介紹了Oracle行級觸發(fā)器的使用,創(chuàng)建觸發(fā)器并使用dblink在插入時進行數據同步,本文結合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • oracle Dbeaver存儲過程語法詳解

    oracle Dbeaver存儲過程語法詳解

    這篇文章主要介紹了oracle Dbeaver存儲過程語法詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-10-10
  • Oracle中分割字符串的方法實例代碼

    Oracle中分割字符串的方法實例代碼

    最近遇到一個問題,需要把一個帶有,的字符串拆分成多行,下面這篇文章主要給大家介紹了關于Oracle中分割字符串的方法,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • Oracle使用like查詢時對下劃線的處理方法

    Oracle使用like查詢時對下劃線的處理方法

    這篇文章主要介紹了Oracle使用like查詢時對下劃線的處理方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03

最新評論