因為Oracle數(shù)據(jù)庫沒有Top關鍵字,所以這里就不能夠像微軟的數(shù)據(jù)據(jù)那樣操作,這里有兩種方法:
成都創(chuàng)新互聯(lián)公司是一家專注于網(wǎng)站建設、成都做網(wǎng)站與策劃設計,福貢網(wǎng)站建設哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設十多年,網(wǎng)設計領域的專業(yè)建站公司;建站業(yè)務涵蓋:福貢等地區(qū)。福貢做網(wǎng)站價格咨詢:13518219792
一種是利用相反的。
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;
1.使用T_BASE_PROVINCE表作為測試演示使用
2.查詢下總共數(shù)據(jù)量select count(*) from T_BASE_PROVINCE,在分頁的時候,一般會顯示總頁數(shù),需要先查詢總數(shù)據(jù)量得到總頁數(shù),總頁數(shù)=總量/每頁顯示記錄數(shù)。
3.前面的測試數(shù)據(jù)初始化完成之后,查詢前20條大概有什么樣的數(shù)據(jù)。
4.含order by排序,多一層嵌套,因為order by在select之后執(zhí)行,不在里面寫的話可能會出現(xiàn)不是預期的排序結果。
如以上回答未能解決問題請看:
一種是利用相反的。
使用minus,即中文的意思就是減去。
一種是利用Oracle的rownum,這個是Oracle查詢自動返回的序號,一般不顯示,但是可以通過select rownum from [表名],可以看到,是從1到當前的記錄總數(shù)。 ? ?
在Oracle中有一個方法rownum用來查詢第一行到第n行的內容,但沒有一個合適的方法若查詢第x行到第y行的內容,而在實際應用中卻經常需要查詢第x行到第y行的內容,這時我們就需要使用rownum和子表查詢等內容來進行查詢,因為這一塊內容屬于Oracle總的常用部分所以專門在此介紹。
在Oralce中有一個偽列rownum,其在創(chuàng)建表的時候就存在了卻不顯示,若要使用這個列可以直接調用即可,也可以對這個列添加別名來調用。
rownum只能用于顯示小于某行的數(shù)據(jù)即第一行開始到你要查詢到的那一行為止的數(shù)據(jù)。
在Oracle把查詢第幾行到第幾行的操作稱為分頁,其具體操作是通過子查詢等操作完成。
select 列名 from (select 表名.*,rownum rn from 表名)表名 ?where rn操作;
思考如下:
1.選擇所有內容
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.其他變化
在某些時候我們需要先對表的內容進行排序,隨后查詢第x行到第y行的內容,這個時候有一個需要注意的點是rownum是在表產生的時候產生的偽列,所以使用排序會連著rownum的值進行排序,從而達不到想要的效果。
為了解決上述這個問題,我們需要使用子表查詢即先排好序,再在新表之中顯示rownum來規(guī)避這個問題。
考慮到排序的問題,所以在上方第二步的時候使用第一種方法即select e.*,rownum rn from(select * from emp)e;,在內表select * from emp中進行排序可以完成在亂序中找到第x行到第y行的效果。
因為一個功能需要讀取一個大表的所有數(shù)據(jù)做業(yè)務處理,那這樣肯定不能一次性查出所有數(shù)據(jù),需要程序分頁查詢處理,模擬測試一個200萬數(shù)據(jù)量的表發(fā)現(xiàn)耗時很久,并不是業(yè)務處理耗時,而且分頁查詢耗時了。oracle的分頁查詢可能大家都知道利用rownum,而且大部分公司這種分頁都是底層封裝好的了,所有平時大家使用的時候也沒注意(這次之后特意留意了一下,我們公司就是用了錯誤的)
這兩條查詢語句看著區(qū)別不大,但是性能卻差很多。經過測試第一種性能最好,而且隨著數(shù)量的增大,幾乎不受影響。第二種隨著數(shù)據(jù)量的增大,查詢速度也越來越慢。表200W條數(shù)據(jù)的情況下,第一種查詢耗時基本是0.3s,第二種基本在1.3s以上。一個查詢足足差了一秒。別小看這1秒。200W條數(shù)據(jù)每次查詢1000條,查詢完也差了2000s=33分鐘.
分頁的目的就是控制輸出結果集大小,將結果盡快的返回。在上面的分頁查詢語句中,這種考慮主要體現(xiàn)在WHERE ROWNUM = 20這句上。
這是由于CBO優(yōu)化模式下,Oracle可以將外層的查詢條件推到內層查詢中,以提高內層查詢的執(zhí)行效率。
對于正確有order by語句,第二層的查詢條件WHERE ROWNUM = 20就可以被Oracle推入到內層查詢中,這樣Oracle查詢的結果一旦超過了ROWNUM限制條件,就終止查詢將結果返回了
對于錯誤有order by 語句,由于查詢條件where b.rowno = 11 and b.rowno = 20是存在于查詢的第三層,而Oracle無法將第三層的查詢條件推到最內層(即使推到最內層也沒有意義,因為最內層查詢不知道b.rowno代表什么)。因此對于這個語句,Oracle最內層返回給中間層的是所有滿足條件的數(shù)據(jù),而中間層返回給最外層的也是所有數(shù)據(jù)。數(shù)據(jù)的過濾在最外層完成,顯然這個效率要比第一個查詢低得多。
上面分析的查詢不僅僅是針對單表的簡單查詢,對于最內層查詢是復雜的多表聯(lián)合查詢或最內層查詢包含排序的情況一樣有效。
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;