關於Oracle數據庫的rownum應用


  它是Oracle系統順序分配為從查詢返回的行的編號,返回的第一行分配的是1,第二行是2,以此類推,這個偽字段可以用於限制查詢返回的總行數,而且rownum不能以任何表的名稱作為前綴。

  如以下語句將無法正常運行:

select student.*, student.rownum from student;

  我們如果要將rownum這個偽字段動態產生的列顯示出來,需要使用如下語句:

select t.*, rownum from student t;

  如果我們在查詢時加入了限制條件,則rownum又將動態生成。結論就是rownum是不會與任何一行進行綁定都是根據查詢后的記錄來生成的:

select t.*, rownum from student t where sage > 25;

  由於rownum的特殊性,我們在使用rownum時必須注意以下事項:

  • 如果希望找到學生表中的第一條學生信息,可以使用rownum=1作為條件。但是想找到學生表中第二條學生的信息,使用rownum=2結果查不到數據。因為rownum始終從1開始,因此1以上的自然數在rownum做等於判斷時都是false條件,所以無法查到rownum=n(n>1的自然數)。
select * from student where rownum = 1;  -- 能查詢到第一條記錄
select * from student where rownum = 2;  -- 不能查詢第二條記錄
  • 如果想找到從第二行記錄以后的記錄,當時用rownum>2是查不出來記錄的,原因是由於rownum是一個總是從1開始的偽列,Oracle認為rownum>n(n>1是自然數)這種條件依舊不成立,所以查不到記錄。
select * from student where rownum > 2;  -- 不能查詢出記錄
  • 如果想找到第三條記錄之前的記錄,當使用rownum<3是能得到兩條記錄的。顯然rownum對於rownum<n(n>1的自然數)的條件認為是成立的,所以可以找到記錄。
select * from student where rownum < 3;  -- 選擇前兩條記錄
  • 如果要查詢后三條記錄,則要考慮的情況又會比較復雜一些,比如我們按學號(SID)和年齡(SAGE)進行倒序排列,查詢最后三條記錄,檢查下面兩個sql語句的結果有何異同:
--  正常返回最后三條記錄
select * from student where rownum < 4 order by sid desc;
--  返回了前三條記錄
select * from student where rownum < 4 order by sage desc;

  我們可以看到,同樣的sql語句,只是排列序不一樣,就導致了完全不一樣的結果。兩個語句的對比中可以看出在第二條語句中rownum並不是以SAGE列生成序列號,而是在插入記錄時以主鍵列為參考生成的。之所以我們在使用第一條語句時可以成功取得最后三條,原因就在於第一條語句是按照主鍵進行排序的。

  • 如果要按照非主鍵為依據來進行最后記錄數的提取,我們需要使用復合查詢語句。
select * from (select * from student order by sage desc) where rownum < 4;
  • 有的時候我們需要對記錄進行分頁,這時我們會期望返回一個指定范圍內的記錄,如,返回第10至第20條,可使用如下sql語句:
select * from student where rownum < 20
minus    --  將兩個記錄集相減
select * from student where rownum < 10;

  或者

select * from (select rownum r, student.* from student where rownum < 20 order by sid) where r >= 10;
  • 提到rownum,不得不得到Oracle表中另外一個隱藏列:rowid,這是存在於每一個表中的用於唯一標識一行數據的由Oracle自動生成和管理的屬性,我們可以認為這是Oracle數據表中的超鍵,在同一個數據庫中,這個超鍵永遠都不會有重復。rowid主要用於快速定位某一行數據,有點類似於一本書的頁碼,可以快速找到內容,常用於索引中。下面這條sql語句可以幫助我們查看每一行數據的rowid。
select student.*, rowid from student;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM