Oracle rownum原理和使用,oraclerownum原理

來源:互聯網
上載者:User

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


相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.