国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
Oracle中查詢r(jià)ownum和rowid的區(qū)別

      在查詢中,我們可以注意到,類似于“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作為查詢條件的情況。在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é)果集為空。寫(xiě)到這里,我忽然有一個(gè)有趣的想法:假如有一條查詢語(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,到rownum<10的時(shí)候就停止查詢?我覺(jué)得應(yīng)該是后者,也就是在執(zhí)行語(yǔ)句的時(shí)候,不是做full scan,而是取夠數(shù)據(jù)就停止查詢。要驗(yàn)證這個(gè)想法應(yīng)該很簡(jiǎn)單,找一個(gè)數(shù)據(jù)量非常大的表進(jìn)行查詢就可以了??上壳拔覜](méi)有這樣的表。

    我們可以看出,直接使用rownum是要受到限制的。但是很容易遇到這樣的需求“查出符合條件的第xx條到第xx條記錄”,比如頁(yè)面的分頁(yè)處理。這個(gè)時(shí)候如何構(gòu)造出適合自己的結(jié)果集?嗯,墻邊那位說(shuō)全取出來(lái)手工挑選的哥們可以拉出去了。當(dāng)然這樣做也是可以的,但是前提是整個(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í)在的字段就可以了。

    具體做法就是利用子查詢,在構(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í)候就確定了??梢岳胷owid來(lái)查詢記錄,而且通過(guò)rowid查詢記錄是查詢速度最快的查詢方法。(這個(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ā)生變化。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Oracle中rownum用法總結(jié)
ORACLE/MYSQL/DB2等不同數(shù)據(jù)庫(kù)取前幾條記錄
Oracle中怎樣取指定范圍內(nèi)的記錄?
oracle與WEB分頁(yè)技術(shù)
ORACLE 中ROWNUM(偽列)用法解析
一條SQL引發(fā)的“血案”:與SQL優(yōu)化相關(guān)的4個(gè)案例
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服