濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > Oracle查詢語(yǔ)句中rownum與rowid的不同之處分析

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

熱門標(biāo)簽:外呼電話系統(tǒng)用卡嗎 七日殺a19.5全地圖標(biāo)注 廣東營(yíng)銷智能外呼系統(tǒng)商家 電渠外呼系統(tǒng) 騰訊地圖標(biāo)注要費(fèi)用嗎 高德地圖標(biāo)注公司名字大全 地圖標(biāo)注怎么保存 N個(gè)你智能電銷機(jī)器人 車瑪仕極限運(yùn)動(dòng)場(chǎng)所地圖標(biāo)注

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

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

select xx from table where rownum  n (n>1) 

這樣的查詢是有正確含義的,而

select xx from table where rownum = n

這樣的查詢只在n=1的時(shí)候成立,

select xx from table where rownum > n (n>1) 

這樣的查詢只能得到一個(gè)空集。

另外

select xx from table where rownum > 0

這個(gè)查詢會(huì)返回所有的記錄。這是為什么呢?原因就在于Oracle對(duì)rownum的處理上,rownum是在得到結(jié)果集的時(shí)候產(chǎn)生的,用于標(biāo)記結(jié)果集中結(jié)果順序的一個(gè)字段,這個(gè)字段被稱為“偽數(shù)列”,也就是事實(shí)上不存在的一個(gè)數(shù)列。它的特點(diǎn)是按順序標(biāo)記,而且是逐次遞加的,換句話說(shuō)就是只有有rownum=1的記錄,才可能有rownum=2的記錄。

讓我們回頭來(lái)分析一下在where中使用rownum作為Oracle查詢條件的情況。在取rownum=1,或者rownum = n (n>1)的時(shí)候,沒(méi)有問(wèn)題。那么為什么當(dāng)條件為rownum = n或者rownum >= n時(shí)明明有數(shù)據(jù)卻只能得到一個(gè)空集呢?假設(shè)我們的查詢條件為rownum = 2,那么在查詢出的第一條記錄的時(shí)候,Oracle標(biāo)記此條記錄rownum為1,結(jié)果發(fā)現(xiàn)和rownum=2的條件不符,于是結(jié)果集為空。
假如有一條查詢語(yǔ)句為

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

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

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

具體做法就是利用子Oracle查詢,在構(gòu)建臨時(shí)表的時(shí)候,把rownum也一起構(gòu)造進(jìn)去。比如

select xx,yy from (select xx,yy,rownum as xyz from table where zz >20) where xyz between 10 and 20

這樣就可以了。

另外使用Oracle提供的結(jié)果集處理函數(shù)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還提供了另外一個(gè)偽數(shù)列:rowid。不過(guò)rowid和rownum不同,一般說(shuō)來(lái)每一行數(shù)據(jù)對(duì)應(yīng)的rowid是固定而且唯一的,在這一行數(shù)據(jù)存入數(shù)據(jù)庫(kù)的時(shí)候就確定了。可以利用rowid來(lái)查詢記錄,而且通過(guò)rowidOracle查詢記錄是查詢速度最快的查詢方法。

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

您可能感興趣的文章:
  • oracle 使用rownum的三種分頁(yè)方式
  • mysql類似oracle rownum寫法實(shí)例詳解
  • oracle中利用關(guān)鍵字rownum查詢前20名員工信息及rownum用法
  • Oracle數(shù)據(jù)庫(kù)rownum和row_number的不同點(diǎn)
  • oracle中rownum和row_number()
  • 隨機(jī)獲取oracle數(shù)據(jù)庫(kù)中的任意一行數(shù)據(jù)(rownum)示例介紹
  • Oracle中使用Rownum分頁(yè)詳細(xì)例子
  • oracle的rownum深入解析
  • ORACLE數(shù)據(jù)庫(kù)中Rownum用法詳解

標(biāo)簽:長(zhǎng)沙 蘇州 大興安嶺 遼寧 玉樹(shù) 贛州 來(lái)賓 棗莊

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Oracle查詢語(yǔ)句中rownum與rowid的不同之處分析》,本文關(guān)鍵詞  Oracle,查詢,語(yǔ)句,中,rownum,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Oracle查詢語(yǔ)句中rownum與rowid的不同之處分析》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Oracle查詢語(yǔ)句中rownum與rowid的不同之處分析的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    金溪县| 加查县| 兖州市| 抚顺县| 石门县| 西充县| 兴安县| 稷山县| 宁武县| 顺平县| 汉阴县| 盐源县| 濮阳市| 苏尼特右旗| 巴彦县| 福海县| 瓮安县| 邳州市| 大关县| 贡山| 峡江县| 巫山县| 青河县| 社会| 绥滨县| 吉林省| 本溪市| 临安市| 池州市| 隆回县| 株洲市| 广饶县| 洞头县| 苗栗市| 砚山县| 建阳市| 双鸭山市| 宜宾市| 丘北县| 都兰县| 勃利县|