1. 程式人生 > >oracle中的rownum和rowid的作用及區分

oracle中的rownum和rowid的作用及區分

最近有時間把前面的知識再複習了一遍,感覺好多知識又模糊了,發現技術這東西,只要歇一段時間不看就容易忘。現在就說說rownum和rowid的區別吧。
rownum和rowid都是偽列,但是兩者的根本是不同的,rownum是根據sql查詢出的結果給每行分配一個邏輯編號,所以你的sql不同也就會導致最終rownum不同,但是rowid是物理結構上的,在每條記錄insert到資料庫中時,都會有一個唯一的物理記錄 ,
例如  AAAMgzAAEAAAAAgAAB 7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30
這裡的AAAMgzAAEAAAAAgAAB物理位置對應了這條記錄,這個記錄是不會隨著sql的改變而改變。
因此,這就導致了他們的使用場景不同了,通常在sql分頁時或是查詢某一範圍內的記錄時,我們會使用rownum。
1、rownum
例如:
查詢2到10範圍內的記錄(這裡包括2和10的記錄)
select *
  from (select rownum rn, a.* from emp a) t
where t.rn between 2 and 10;

查詢前三名的記錄
select * from emp a where rownum < 3;這裡我們要注意,直接用rownum查詢的範圍必須要包含1;因為rownum是從1開始記錄的,當然你可以把rownum查出來後放在一個虛表中作為這個虛表的欄位再根據條件查詢。
例如:
select *
  from (select rownum rn, a.* from emp a) t
where t.rn > 2;這就可以了

2、rowid
我們在處理一張表中重複記錄時經常用到他,當然你也可以用一個很原始的方法,就是將有重複記錄的表中的資料導到另外一張表中,最後再倒回去。
SQL>create table stu_tmp as select distinct* from stu;
SQL>truncate table sut;        //清空表記錄
SQL>insert into stu select * from stu_tmp;    //將臨時表中的資料添加回原表但是要是stu的表資料是百萬級或是更大的千萬級的,那這樣的方法顯然是不明智的,因此我們可以根據rowid來處理,rowid具有唯一性,查詢時效率是很高的,
例如,學生表中的姓名會有重複的情況,但是學生的學號是不會重複的,如果我們要刪除學生表中姓名重複只留學號最大的學生的記錄,怎麼辦呢?
delete from stu a
    where rowid not  in (select max(rowid)
                          from stu b
                         where a.name = b.name
                           and a.stno < b.stno);
這樣就可以了。

相關推薦

oraclerownumrow_number()

cnblogs 計算 順序分配 每一個 total tom ins 使用 div row_number()over(partition by col1 order by col2)表示根據col1分組,在分組內部根據col2排序,而此函數計算的值就表示每組內部排序後的順序編

oraclerownumrowid作用區分

最近有時間把前面的知識再複習了一遍,感覺好多知識又模糊了,發現技術這東西,只要歇一段時間不看就容易忘。現在就說說rownum和rowid的區別吧。 rownum和rowid都是偽列,但是兩者的根本是不同的,rownum是根據sql查詢出的結果給每行分配一個邏輯編號,所以你

Oraclerownum rowid的用法區別

hashcode 去重 pre weight row 動態 自己 log gpo 1.rownum是偽列,是在獲取查詢結果集後再加上去的 (獲取一條記錄加一個rownum)。對符合條件的結果添加一個從1開始的序列號。 eg: select rownum,phon

OracleROWNUM偽列ROWID偽列的用法與區別

做過Oracle分頁的人都知道由於Oracle中沒有像MySql中limit函式以及SQLServer中的top關鍵字等,所以只能通過偽列的方式去滿足分頁功能,在此,不談分頁方法,只從根本上去介紹這兩個偽列的用法與原理,同樣還是以scott使用者的emp表為例;一、ROWNUM偽列ROWNUM 是Oracle

oracle 之 偽列 rownum rowid的用法與區別

lena select 區別 name 繼續 class 重復 clas 重復數據 rownum的用法 select rownum,empno,ename,job from emp where rownum<6 可以得到小於6的值數據 select rownum,e

oracle的sequence的概念作用

sequence是用來在多使用者環境下產生唯一整數的資料庫物件。序列產生器順序生成數字,它可用於自動生成主鍵值,並能協調多行或者多表的主鍵操 作。沒有sequence,順序的值只能靠編寫程式來生成。先找出最近產生的值然後自增長。這種方法要求一個事務級別的鎖,這將導致在多使用

對比Oracletruncatedelete的區別效能

可見delete刪除表還可以回滾,而truncate截斷表就不能回滾了.(前提是delete操作沒有提交) 2.高水線 所有的Oracle表都有一個容納資料的上限(很象一個水庫歷史最高的水位),我們把這個上限稱為“high water mark”或HWM。這個HWM是一個標記(專門有一個數據塊用來記錄高水標記

ORACLE建立包包體函式儲存過程

背景:在Oracle資料庫建立包,在包建立函式Function和儲存過程Procedure。在java專案中呼叫。 建立包,並在下面宣告包含的函式和儲存過程: create or replace p

Oracle 的sql函數以分頁

轉換 通用 pro page 大寫 example 分享 bstr case SELECT LPAD(‘Page 1‘,15,‘*.‘) "LPAD example" FROM DUAL; 1.分頁查詢 (1)方法一:使用 between and

Oraclechr()ascii()函數(附:常用字符與ascii對照表)

關鍵字 回車 pps body api adding com eve amp Oracle中chr()和ascii()函數(附:常用字符與ascii對照表) 關鍵字:chr() chr()函數作用:“特殊”字符特殊處理 在PLSql中可查詢相對應的字碼與特殊符 chr()函

javaSystem.getProperty()的作用使用

south pro name watermark sta tin fontsize sun copyto Java中給我們提供了System.getProperty()這個函數,這個函數可以獲取到Java JVM以及操作系統的一些參數,可以供程序判斷等。 System.ge

ORACLENVLlCOALESCE的區別

oracl 第一個 ssi 必須 如果 不一致 miss 兩個 oal nvl(COMMISSION_PCT,0)如果第一個參數為null,則返回第二個參數如果第一個參數為非null,則返回第一個參數 COALESCE(EXPR1,EXPR2,EXPR3...EXPRn)從

OracleBlobClob

oracl rac clas 存儲 tchar ring jdbc input inpu Blob是指二進制大對象也就是英文Binary Large Object的所寫;Clob是指大字符對象也就是英文Character Large Object的所寫。因此這兩個類型都是用

Oraclenvl()、instr()、執行多條sql事務操作

col blog acl val 關鍵字 關鍵字查詢 tps art 數據類型 Oracle的Nvl函數 nvl( ) 函數 從兩個表達式返回一個非null 值。 語法 NVL(eExpression1, eExpression2) 參數 eExpression1, eE

ORACLESIDSERVICE_NAME的區別

spring 好的 java應用程序 系列 sdn 文件 數據 jdbc 修改 先來講一個小故事,2015年6月份,有個客戶遷移了數據庫,由單實例數據庫變成了RAC。JAVA應用程序出現了無法連接數據庫的情況,但是PL/SQL能連接上數據庫。由於項目比較龐大,

Oracleinstrsubstr 的應用

instr函式 instr函式用於從指定的位置開始,從某物件中查詢第N個與模式匹配的字串。 例項:   SELECT instr(‘syranmo’,’s’) FROM dual; – 返回 1   SELECT instr(‘syranmo’,’ra’) FROM dual; –

轉:ORACLE ROWNUM用法總結!

oracle 分頁查詢語句:select * from (select u.*,rownum r from (select * from userifno) u where rownum<大值) where r>小值 問題: ①為什麼一定要用  u.*?    原因:Or

ORACLEdatetimestamp的相互轉化

原文章地址:https://blog.csdn.net/chenlong331409178/article/details/47441025 oracle 中date型別精確可以年月日,時分秒,timestamp型別可以精確的秒一下 data轉為timstamp data 轉為timstam可

oracle資料庫總結(七)--ORACLE ROWNUM用法總結! (轉)

來自:http://www.cnblogs.com/chinhr/archive/2007/09/30/911685.html   ORACLE 中ROWNUM用法總結!  對於 Oracle 的 rownum 問題,很多資料都說不支援>,>=,=,betwe

Oracle時間日期格式轉換常用日期函式

我的第一篇部落格,記錄學習,分享生活。 Oracle時間日期格式轉換: 主要有兩種格式,一種為日期格式date,一種為字元格式char。 查詢當前日期: select sysdate from dual; 將日期轉化為字元格式,可以對日期進行一些操作 --顯示所有僱員的姓名和加