Oracle資料庫之rownum

2022-07-15 08:27:15 字數 1583 閱讀 3252

1. 介紹

當我們在做查詢時,經常會遇到如查詢限定行數或分頁查詢的需求,mysql中可以使用limit子句完成,在mssql中可以使用top子句完成,那麼在oracle中,我們如何實現呢?

oracle提供了乙個rownum的偽列,它會根據返回記錄生成乙個序列化的數字。

rownum和rowid都是偽列,但是兩者的根本是不同的。rownum是根據sql查詢出的結果給每行分配乙個邏輯編號,所以sql不同也就會導致最終rownum不同;rowid是物理結構上的,在每條記錄insert到資料庫中時,都會有乙個唯一的物理記錄。

2. 限定查詢行數

如果希望限定查詢結果集的前幾條資料,通過rownum可以輕鬆實現。

示例:

--

查詢前三條員工的記錄

select

*from employee where rownum <=

3;

3. 分頁查詢

在資料庫應用系統中,我們會經常使用到分頁功能,如每頁顯示5條記錄,查詢第2頁內容該如何查詢呢?

select

*from employee where rownum >

5and rownum <=

10;

上面的sql語句是否能查詢出我們想要的結果呢?

當執行該sql就會發現,顯示出來的結果要讓你失望了:查不出一條記錄,即使表中有20條記錄。問題是出在哪呢?

因為rownum是對結果集加的乙個偽列(即先查到結果集之後再加上去的乙個列),簡單的說rownum是對符合條件結果集新增的序列號。它總是從1開始排起的,所以選出的結果中不可能沒有1,而有其他大於1的值。

rownum > 5 and rownum <= 10 查詢不到記錄,因為如果第一條的 rownum = 1,不滿足條件被去掉,第二條的rownum又成了1,繼續判斷,所以永遠沒有滿足條件的記錄。

任何時候想把 rownum = 1 這條記錄拋棄是不對的,它在結果集中是不可或缺的,少了rownum=1 就像空中樓閣一般不能存在,所以你的 rownum 條件要包含到 1。

那麼,如果想要用 rownum > 5 這種條件的話就要用子查詢,把rownum先生成,然後再對生成結果進行查詢。

示例:

select

*from

(

select e.*, rownum r from employee where rownum <=

10) t

where t.r >

5;

4. 使用rownum的注意事項

不能對rownum使用》(大於1的數值)、>=(大於1的數值)、=(大於1的數值),否則無結果。

在使用rownum時,只有當order by的字段是主鍵時,查詢結果才會先排序再計算rownum,但是,對非主鍵字段(如:name)進行排序時,結果可能就混亂了。出現混亂的原因是:oracle先按物理儲存位置(rowid)順序取出滿足rownum條件的記錄,即物理位置上的前5條資料,然後在對這些資料按照order by的字段進行排序,而不是我們所期望的先排序、再取特定記錄數。

Oracle筆記之Oracle資料庫資料型別

1 char 定長,create table tablename filed1 char 32 最大2000個字元,存放時超過報錯,不足補空格。補 dump函式,檢視字段資訊。select filed1,dump filed1 from tablename 2 varchar2 變長,最大4000個...

Oracle資料庫之SQL select之一

前篇筆者已經說明,最好的學習就是實戰!因此我的學習也就是從實戰中展開的。在一切sql 語句中最基本的莫過於查詢語句了,因此筆者也是從select語句開始學習的。其實這部分筆者 已經掌握,但是還是有必要重新掌握的。對於前期的學習,主要用到的是oracle資料庫中本就存在的一些表,這裡筆者使用scott...

Oracle資料庫之序列

序列是乙個計數器,它並不會與特定的表關聯。我們可以通過建立oracle序列和觸發器實現表的主鍵自增。序列的用途一般用來填充主鍵和計數。一 建立序列 語法結構 create sequence schema.sequence name integer 完整語法結構見 說明 schema 模式,即使用者名...