含**釋:
1、rownum是oracle系統順序分配為從查詢返回的行的編號,返回的第一行分配的是1,第二行是2,
依此類推,這個偽欄位可以用於限制查詢返回的總行數。
2、rownum不能以任何基表的名稱作為字首。
使用方法:
現有乙個商品銷售表sale,表結構為:
month char(6) --月份
sell number(10,2) --月銷售金額
create table sale (month char(6),sell number);
insert into sale values('200001',1000);
insert into sale values('200002',1100);
insert into sale values('200003',1200);
insert into sale values('200004',1300);
insert into sale values('200005',1400);
insert into sale values('200006',1500);
insert into sale values('200007',1600);
insert into sale values('200101',1100);
insert into sale values('200202',1200);
insert into sale values('200301',1300);
insert into sale values('200008',1000);
commit;
sql> select rownum,month,sell from sale where rownum=1;(可以用在限制返回記錄條數的地方,保證不出錯,如:隱式游標)
rownum month sell
--------- ------ ---------
1 200001 1000
sql> select rownum,month,sell from sale where rownum=2;(1以上都查不到記錄)
沒有查到記錄
sql> select rownum,month,sell from sale where rownum>5;
(由於rownum是乙個總是從1開始的偽列,oracle 認為這種條件不成立,查不到記錄)
沒有查到記錄
只返回前3條紀錄
sql> select rownum,month,sell from sale where rownum<4;
rownum month sell
--------- ------ ---------
1 200001 1000
2 200002 1100
3 200003 1200
如何用rownum實現大於、小於邏輯?(返回rownum在4—10之間的資料)(minus操作,速度會受影響)
sql> select rownum,month,sell from sale where rownum<10
2 minus
3 select rownum,month,sell from sale where rownum<5;
rownum month sell
--------- ------ ---------
5 200005 1400
6 200006 1500
7 200007 1600
8 200101 1100
9 200202 1200
想按日期排序,並且用rownum標出正確序號(有小到大)
sql> select rownum,month,sell from sale order by month;
rownum month sell
--------- ------ ---------
1 200001 1000
2 200002 1100
3 200003 1200
4 200004 1300
5 200005 1400
6 200006 1500
7 200007 1600
11 200008 1000
8 200101 1100
9 200202 1200
10 200301 1300
查詢到11記錄.
可以發現,rownum並沒有實現我們的意圖,系統是按照記錄入庫時的順序給記錄排的號,rowid也是順序分配的
sql> select rowid,rownum,month,sell from sale order by rowid;
rowid rownum month sell
------------------ --------- ------ ---------
000000e4.0000.0002 1 200001 1000
000000e4.0001.0002 2 200002 1100
000000e4.0002.0002 3 200003 1200
000000e4.0003.0002 4 200004 1300
000000e4.0004.0002 5 200005 1400
000000e4.0005.0002 6 200006 1500
000000e4.0006.0002 7 200007 1600
000000e4.0007.0002 8 200101 1100
000000e4.0008.0002 9 200202 1200
000000e4.0009.0002 10 200301 1300
000000e4.000a.0002 11 200008 1000
查詢到11記錄.
正確用法,使用子查詢
sql> select rownum,month,sell from (select month,sell from sale group by month,sell) where rownum<13;
rownum month sell
--------- ------ ---------
1 200001 1000
2 200002 1100
3 200003 1200
4 200004 1300
5 200005 1400
6 200006 1500
7 200007 1600
8 200008 1000
9 200101 1100
10 200202 1200
11 200301 1300
按銷售金額排序,並且用rownum標出正確序號(有小到大)
sql> select rownum,month,sell from (select sell,month from sale group by sell,month) where rownum<13;
rownum month sell
--------- ------ ---------
1 200001 1000
2 200008 1000
3 200002 1100
4 200101 1100
5 200003 1200
6 200202 1200
7 200004 1300
8 200301 1300
9 200005 1400
10 200006 1500
11 200007 1600
查詢到11記錄.
利用以上方法,如在列印報表時,想在查出的資料中自動加上行號,就可以利用rownum。
返回第5—9條紀錄,按月份排序
sql> select * from (select rownum row_id ,month,sell
2 from (select month,sell from sale group by month,sell))
3 where row_id between 5 and 9;
row_id month sell
---------- ------ ----------
5 200005 1400
6 200006 1500
7 200007 1600
8 200008 1000
9 200101 1100
專案中遇到:
select * from (
select * from view_wf_flow_entity
where del_flag = 0
and ftype_id = 2
and fentity_object_id = 6106
order by data_state desc
) where rownum = 1;
Oracle中rownum的用法
1 查詢第幾行的記錄 select sal from emp where rownum 1 查詢得到第一行記錄 select sal from emp where rownum 5 不可以查詢到第五行記錄,因為 rownum 總是從1 開始查詢的,故這種方式不可以直接得到第幾行的記錄。若想得到第五行...
Oracle中rownum的用法
1 查詢第幾行的記錄 select sal from emp where rownum 1 查詢得到第一行記錄 select sal from emp where rownum 5 不可以查詢到第五行記錄,因為rownum 總是從1開始查詢的,故這種方式不可以直接得到第幾行的記錄。若想得到第五行記錄...
oracle中rownum的用法
對於 oracle 的 rownum 問題,很多資料都說不支援 between.and,只能用以上符號 並非說用 gt between.and 時會提示sql語法錯誤,而是經常是查不出一條記錄來,還會出現似乎是莫名其妙的結果來,其實您只要理解好了這個 rownum 偽列的意義就不應該感到驚奇,同樣是...