oracle數(shù)據(jù)排序后獲取前幾行數(shù)據(jù)的寫法(rownum、fetch方式)
0. 前言
無論在工作中,還是學(xué)習(xí)中,都會出現(xiàn)這樣子的需求,對某張表進(jìn)行了排序(按時(shí)間排序也好,其他字段排序也罷),然后獲取前x行的數(shù)據(jù),由于工作中經(jīng)常出現(xiàn),因此寫篇文章記錄一下多種寫法。
1. 先說結(jié)論
- 第一種使用rownum方式,在oracle數(shù)據(jù)庫中,查詢出來的數(shù)據(jù),可以通過rownum(行數(shù))來指定具體第幾行數(shù)據(jù),但需要注意以下幾點(diǎn):
- 查詢出來的數(shù)據(jù),第一行是 rownum=1,并不是從0開始的。
- 用rownum方式獲取數(shù)據(jù),必須要有一層嵌套select語句,這也是此方法最大的缺點(diǎn),導(dǎo)致sql多一層。
- 常用語法: select * from ( select * from people order by id desc ) where rownum = 1
- 第二種使用fetch方式,其還可以用于分頁查詢使用,fetch使用需要注意如下幾點(diǎn):
- oracle版本得12以上,否則無法使用了。
- 使用格式: OFFSET n ROWS FETCH NEXT m ROWS ONLY 從第n行開始,往后取m行(注 不包括第n行數(shù)據(jù))
- 也可以簡寫為 FETCH NEXT m ROWS ONLY 從頭開始往后取m行
- 無需多一層select嵌套,可以直接寫在sql最后
2. 舉個(gè)例子
1. 數(shù)據(jù)準(zhǔn)備
在之前所說的,在線oracle學(xué)習(xí)網(wǎng)站中準(zhǔn)備好數(shù)據(jù)如下:
CREATE TABLE people ( id varchar2(10), name varchar2(10), sex varchar2(10) ); INSERT INTO people VALUES ('1', '小明', '男'); INSERT INTO people VALUES ('2', '小紅', '女'); INSERT INTO people VALUES ('3', '小黃', '男'); INSERT INTO people VALUES ('4', '小紫', '男'); INSERT INTO people VALUES ('5', '小綠', '男'); INSERT INTO people VALUES ('6', '小白', '男'); INSERT INTO people VALUES ('7', '大強(qiáng)', '男'); INSERT INTO people VALUES ('8', '大青', '男');
這里將id類比時(shí)間字段,一般查詢根據(jù)時(shí)間進(jìn)行倒序:
select * from people order by id desc
2. 使用rownum方式獲取前幾行數(shù)據(jù)
在oracle數(shù)據(jù)庫中,查詢出來的數(shù)據(jù),可以通過rownum(行數(shù))來指定具體第幾行數(shù)據(jù),但需要注意以下幾點(diǎn):
- 查詢出來的數(shù)據(jù),第一行是 rownum=1,并不是從0開始的。
- 用rownum方式獲取數(shù)據(jù),必須要有一層嵌套select語句,這也是此方法最大的缺點(diǎn),導(dǎo)致sql多一層。
倒序查詢之后,獲取第一行數(shù)據(jù):
select * from ( select * from people order by id desc ) where rownum = 1
倒序查詢之后,獲取前4行數(shù)據(jù):
select * from ( select * from people order by id desc ) where rownum <= 4
如果不使用嵌套select,則會報(bào)錯(cuò)語法錯(cuò)誤:
3. 使用fetch方式獲取前幾行數(shù)據(jù)(推薦)
fetch方式除了獲取前幾行數(shù)據(jù),還有另一個(gè)作用,就是進(jìn)行分頁的時(shí)候使用。
fetch使用需要注意如下幾點(diǎn):
- oracle版本得12以上,因此上面的在線學(xué)習(xí)oracle網(wǎng)頁無法使用了。
- 使用格式: OFFSET n ROWS FETCH NEXT m ROWS ONLY 從第n行開始,往后取m行(注 不包括第n行數(shù)據(jù))
- 也可以簡寫為 FETCH NEXT m ROWS ONLY 從頭開始往后取m行
- 無需多一層select嵌套,可以直接寫在sql最后
倒序查詢之后,獲取第一行數(shù)據(jù):
select * from people order by id desc fetch next 1 rows only
倒序查詢之后,獲取前4行數(shù)據(jù):
select * from people order by id desc fetch next 4 rows only
fetch用于分頁,從第n行后,取m返回結(jié)果集
select * from people order by id desc OFFSET n ROWS FETCH NEXT m ROWS ONLY
總結(jié)
到此這篇關(guān)于oracle數(shù)據(jù)排序后獲取前幾行數(shù)據(jù)的寫法(rownum、fetch方式)的文章就介紹到這了,更多相關(guān)oracle數(shù)據(jù)排序后獲取數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解析如何查看Oracle數(shù)據(jù)庫中某張表的字段個(gè)數(shù)
本篇文章是對查看Oracle數(shù)據(jù)庫中某張表的字段個(gè)數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06Plsql Developer連接Oracle時(shí)出現(xiàn)Could not initialize oci.dll解決方案
這篇文章主要介紹了Plsql Developer連接Oracle時(shí)出現(xiàn)Could not initialize oci.dll解決方案,需要的朋友可以參考下2017-03-03PL/SQL實(shí)現(xiàn)Oracle數(shù)據(jù)庫任務(wù)調(diào)度
PL/SQL實(shí)現(xiàn)Oracle數(shù)據(jù)庫任務(wù)調(diào)度...2007-03-03oracle刪除數(shù)據(jù)但表空間占用率沒有減小的情況
這篇文章主要介紹了oracle刪除數(shù)據(jù)但表空間占用率沒有減小的情況,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02Windows10 x64安裝、配置Oracle 11g過程記錄(圖文教程)
這篇文章主要介紹了Windows10 x64安裝、配置Oracle 11g過程記錄(圖文教程),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03