Oracle rownum原理和使用,oraclerownum原理
對於查詢返回的每一行,使用rownum偽列返回一個數字,表示oracle從表中選擇行或將加入行的順序。
選擇的第一行rownum為1,第二行為2,以此類推。
可以使用rownum來限制由查詢返回的行數,如下例子:
select * from test where rownum < 10;
如果一個order by子句和rownum在同一個查詢,那麼行會由order by子句中重新排序,看如下例子
select rownum, name, address, birthday from test where rownum < 5 order by birthday;
我們發現rownum並不是順序的,系統是按照記錄插入的時候給記錄排的號,解決這個問題 需要使用子查詢
select rownum, name, address, birthday from (select name, address, birthday from test order by birthday) where rownum < 5
這樣就成了按birthday排序,並且用rownum標出正確序號(由小到大)
前面我們使用rownum<10查詢出來了9條資料,這次我們使用rownum>1來查詢一下資料
select * from test where rownum > 1;
發現該查詢無返回任何資料,所以我們無法使用rownum = n 或 rownum > n(n>1的自然數)來進行查詢
原因是:
第一行讀取被分配為1,rownum>1使得條件為假,接著讀取第二行現在變為第一行,並還分配為1
rownum使得條件依然是假,所有行隨後均未能滿足該條件,所以沒有行被返回。
如果非要rownum大於一個正整數來查詢,還得需要子查詢來實現
select num, name, address, birthday from (select rownum as num, name, address, birthday from test) where num > 5;
也可以使用between...and...
select num, name, address, birthday from (select rownum as num, name, address, birthday from test) where num between 5 and 10
SQL測試指令碼:
create table test( name varchar2(100), address varchar2(100), birthday date);insert into test values('name1','address1',to_date('1990-04-10','yyyy-MM-dd'));insert into test values('name2','address2',to_date('1989-06-11','yyyy-MM-dd'));insert into test values('name3','address3',to_date('1991-08-23','yyyy-MM-dd'));insert into test values('name4','address4',to_date('1998-12-04','yyyy-MM-dd'));insert into test values('name5','address5',to_date('1985-07-16','yyyy-MM-dd'));insert into test values('name6','address6',to_date('1988-04-08','yyyy-MM-dd'));insert into test values('name7','address7',to_date('1992-08-26','yyyy-MM-dd'));insert into test values('name8','address8',to_date('1995-11-10','yyyy-MM-dd'));insert into test values('name9','address9',to_date('1988-03-28','yyyy-MM-dd'));insert into test values('name10','address10',to_date('1982-05-02','yyyy-MM-dd'));insert into test values('name11','address11',to_date('1991-10-19','yyyy-MM-dd'));
參考檔案
https://docs.oracle.com/cd/E18283_01/server.112/e17118/pseudocolumns009.htm
作者:itmyhome