因為Oracle數(shù)據(jù)庫沒有Top關鍵字,所以這里就不能夠像微軟的數(shù)據(jù)據(jù)那樣操作,這里有兩種方法:
金沙網(wǎng)站建設公司成都創(chuàng)新互聯(lián)公司,金沙網(wǎng)站設計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為金沙上1000家提供企業(yè)網(wǎng)站建設服務。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢,請找那個售后服務好的金沙做網(wǎng)站的公司定做!
一種是利用相反的。
PAGESIZE:每頁顯示的記錄數(shù)
CURRENTPAGE:當前頁號
數(shù)據(jù)表的名字是:components
索引主鍵字是:id
select * from components where id not in(select id from components where rownum=(PAGESIZE*(CURRENTPAGE-1))) and rownum=PAGESIZE order by id;
如下例:
select * from components where id not in(select id from components where rownum=100) and rownum=10 order by id;
從101到記錄開始選擇,選擇前面10條。
使用minus,即中文的意思就是減去,呵呵,這語句非常的有意思,也非常好記
select * from components where rownum=(PAGESIZE*(CURRENTPAGE-1)) minus select * from components where rownum=(PAGESIZE*(CURRENTPAGE-2));
如例:select * from components where rownum=10 minus select * from
一種是利用Oracle的rownum,這個是Oracle查詢自動返回的序號,一般不顯示,但是可以通過select rownum from [表名],可以看到,是從1到當前的記錄總數(shù)。
select * from (select rownum tid,components.* from components where rownum=100) where tid=10;
下面兩種用可以用rownum的變通方式實現(xiàn)分頁:
select
*
from
(select
rownum
row_num,month,sell
from
(select
month,sell
from
sale
group
by
month,sell)
)
where
row_num
between
5
and
9;【網(wǎng)友評論】
select
dmp.row_num,dmp.requirement_id
from
(select
rownum
as
row_num,
requirement_id
from
(select
requirement_id
from
requirement
order
by
requirement_id
desc)
)
dmp
where
row_num
between
10
and
20;【網(wǎng)友評論】
在Oracle中 用SQL來實現(xiàn)分頁有很多種實現(xiàn)方式 但有些語句可能并不是很通用 只能用在一些特殊場景之中
以下介紹三種比較通用的實現(xiàn)方案 在以下各種實現(xiàn)中 ROWNUM是一個最核心的關鍵詞 在查詢時他是一個虛擬的列 取值為 到記錄總數(shù)的序號
首先來介紹我們工作中最常使用的一種實現(xiàn)方式
SELECT *
FROM (SELECT ROW_ * ROWNUM ROWNUM_
FROM (SELECT *
FROM TABLE
WHERE TABLE _ID = XX
ORDER BY GMT_CREATE DESC) ROW_
WHERE ROWNUM = )
WHERE ROWNUM_ = ;
其中最內(nèi)層的查詢SELECT為不進行翻頁的原始查詢語句 可以用自己的任意Select SQL替換 ROWNUM = 和ROWNUM = 控制分頁查詢的每頁的范圍
分頁的目的就是控制輸出結果集大小 將結果盡快的返回 上面的SQL語句在大多數(shù)情況擁有較高的效率 主要體現(xiàn)在WHERE ROWNUM = 這句上 這樣就控制了查詢過程中的最大記錄數(shù)
上面例子中展示的在查詢的第二層通過ROWNUM = 來控制最大值 在查詢的最外層控制最小值 而另一種方式是去掉查詢第二層的WHERE ROWNUM = 語句 在查詢的最外層控制分頁的最小值和最大值 此時SQL語句如下 也就是要介紹的第二種實現(xiàn)方式
SELECT *
FROM (SELECT A * ROWNUM RN
FROM (SELECT *
FROM TABLE
WHERE TABLE _ID = XX
ORDER BY GMT_CREATE DESC) A)
WHERE RN BEEEN AND ;
由于Oracle可以將外層的查詢條件推到內(nèi)層查詢中 以提高內(nèi)層查詢的執(zhí)行效率 但不能跨越多層
對于第一個查詢語句 第二層的查詢條件WHERE ROWNUM = 就可以被Oracle推入到內(nèi)層查詢中 這樣Oracle查詢的結果一旦超過了ROWNUM限制條件 就終止查詢將結果返回了
而 第二個查詢語句 由于查詢條件BEEEN AND 是存在于查詢的第三層 而Oracle無法將第三層的查詢條件推到最內(nèi)層(即使推到最內(nèi)層也沒有意義 因為最內(nèi)層查詢不知道RN代表什么) 因此 對于第二個查詢語句 Oracle最內(nèi)層返回給中間層的是所有滿足條件的數(shù)據(jù) 而中間層返回給最外層的也是所有數(shù)據(jù) 數(shù)據(jù)的過濾在最外層完成 顯然這個效率要比第一個查詢低得多
以上兩種方案完全是通過ROWNUM來完成 下面一種則采用ROWID和ROWNUM相結合的方式 SQL語句如下
SELECT *
FROM (SELECT RID
FROM (SELECT R RID ROWNUM LINENUM
FROM (SELECT ROWID RID
FROM TABLE
WHERE TABLE _ID = XX
ORDER BY GMT_CREATE DESC) R
WHERE ROWNUM = )
WHERE LINENUM = ) T
TABLE T
WHERE T RID = T ROWID;
從語句上看 共有 層Select嵌套查詢 最內(nèi)層為可替換的不分頁原始SQL語句 但是他查詢的字段只有ROWID 而沒有任何待查詢的實際表字段 具體查詢實際字段值是在最外層實現(xiàn)的
這種方式的原理大致為 首先通過ROWNUM查詢到分頁之后的 條實際返回記錄的ROWID 最后通過ROWID將最終返回字段值查詢出來并返回
和前面兩種實現(xiàn)方式相比 該SQL的實現(xiàn)方式更加繁瑣 通用性也不是非常好 因為要將原始的查詢語句分成兩部分(查詢字段在最外層 表及其查詢條件在最內(nèi)層)
但這種實現(xiàn)在特定場景下還是有優(yōu)勢的 比如我們經(jīng)常要翻頁到很后面 比如 條記錄中我們經(jīng)常需要查 及其以后的數(shù)據(jù) 此時該方案效率可能要比前面的高
因為前面的方案中是通過ROWNUM = 來控制的 這樣就需要查詢出 條數(shù)據(jù) 然后取最后 之間的數(shù)據(jù) 而這個方案直接通過ROWID取需要的那 條數(shù)據(jù)
從不斷向后翻頁這個角度來看 第一種實現(xiàn)方案的成本會越來越高 基本上是線性增長 而第三種方案的成本則不會像前者那樣快速 他的增長只體現(xiàn)在通過查詢條件讀取ROWID的部分
當然 除了以上提了這些方案 我們還可以用以下的SQL來實現(xiàn)
SELECT *
FROM TABLE
WHERE TABLE _ID NOT IN
(SELECT TABLE _ID FROM TABLE WHERE ROWNUM = )
AND ROWNUM = ;
SELECT *
FROM TABLE
WHERE ROWNUM =
MINUS
SELECT * FROM TABLE WHERE ROWNUM = ;
………………
注意 當ROWNUM作為查詢條件時 他是在order by之前執(zhí)行 所以要特別小心
比如我們想查詢TABLE 中按TABLE _ID倒序排列的前 條記錄不能用如下的SQL來完成
lishixinzhi/Article/program/Oracle/201311/11198
在Oracle中有一個方法rownum用來查詢第一行到第n行的內(nèi)容,但沒有一個合適的方法若查詢第x行到第y行的內(nèi)容,而在實際應用中卻經(jīng)常需要查詢第x行到第y行的內(nèi)容,這時我們就需要使用rownum和子表查詢等內(nèi)容來進行查詢,因為這一塊內(nèi)容屬于Oracle總的常用部分所以專門在此介紹。
在Oralce中有一個偽列rownum,其在創(chuàng)建表的時候就存在了卻不顯示,若要使用這個列可以直接調(diào)用即可,也可以對這個列添加別名來調(diào)用。
rownum只能用于顯示小于某行的數(shù)據(jù)即第一行開始到你要查詢到的那一行為止的數(shù)據(jù)。
在Oracle把查詢第幾行到第幾行的操作稱為分頁,其具體操作是通過子查詢等操作完成。
select 列名 from (select 表名.*,rownum rn from 表名)表名 ?where rn操作;
思考如下:
1.選擇所有內(nèi)容
select * from emp;
2.顯示rownum
select e.*,rownum rn from(select * from emp)e;
這一步可以精簡為下面形式,但某些情況只能用上面那種
select emp.*,rownum rn from emp;
3.查詢
select * from(select e.*,rownum rn from (select * from emp)e);
4.其他變化
在某些時候我們需要先對表的內(nèi)容進行排序,隨后查詢第x行到第y行的內(nèi)容,這個時候有一個需要注意的點是rownum是在表產(chǎn)生的時候產(chǎn)生的偽列,所以使用排序會連著rownum的值進行排序,從而達不到想要的效果。
為了解決上述這個問題,我們需要使用子表查詢即先排好序,再在新表之中顯示rownum來規(guī)避這個問題。
考慮到排序的問題,所以在上方第二步的時候使用第一種方法即select e.*,rownum rn from(select * from emp)e;,在內(nèi)表select * from emp中進行排序可以完成在亂序中找到第x行到第y行的效果。
您好:oracle查詢分頁可分為兩種情況,一種使用的是rownum ,另外一種則是使用 row_number() over(order by column_name desc)。
1.使用rownum分頁查詢,可用以下方式:
select t2.* from (select t1.*,rownum as rn from table_name t1 where 1=1 and rownum = page * page_size) t2 where t2.rn (page - 1) * page_size;
2.使用 row_number() over() 分頁查詢
select t2.* from (select t1.*,row_number() over(order by column_name desc) as rn from table_name t1 where 1=1 )t2 where t2.rn (page-1)* page_size and t2.rn = page * page_size;
這種方式,也是可以分頁的。
希望能幫助您!