oracle中的sql分頁查詢原理和方法詳解
本文分析並介紹oracle中的分頁查詢的方法。
oracle中的表,除了我們建表時設計的各個字段,其實還有兩個字段(此處只介紹2個),分別是rowid(行標示符)和rownum(行號),即使我們使用describe命令檢視表的結構,也是看不到這兩個列的描述的,因為,他們其實是只在資料庫內部使用的,所以也通常稱他們為偽列(pseudo column)。
下面我們先建表並新增一些資料來驗證上面的說明。
建表:create table users(
id integer primary key,
name nvarchar2(20)
)插入資料:
insert intousers(id,name)values(1,'tom');
insert intousers(id,name)values(2,'cat');
insert intousers(id,name)values(3,'bob');
insert intousers(id,name)values(4,'anxpp');
insert intousers(id,name)values(5,'ez');
insert intousers(id,name)values(6,'lily');
使用describe命令檢視表結構:
可以看到,確實只有建表時的兩個字段。
但我們可以查詢的時候,查詢到偽列的值:
selectrowid,rownum,id,name fromusers;
結果:這個rowid我們一般用不到,oracle資料庫內部使用它來儲存行的物理位置,是乙個18位的數字,採用base-64編碼。
而這個rownum,我們也正是使用它來進行分頁查詢的,它的值,就是表示的該行的行號。
對於分頁,我們只要想辦法可以查詢到從某一起始行到終止行就可以的,分頁的邏輯可以放到程式裡面。於是,我們理所當然會想到如下語句查詢第2頁的資料(每頁2條資料,頁碼從1開始,所以起始行的行號為 (頁碼-1)*每頁長度+1=3,終止行的行號為 頁碼*每頁長度=4):
select*fromusers whererownum>=3rownum <=4;
哈哈!是不是發現沒有任何結果,原因很簡單,oracle機制就是這樣的:因為第一條資料行號為1,不符合》=3的條件,所以第一行被去掉,之前的第二行變為新的第一行(即這個行號不是寫死的,可以理解為是動態的),如此下去,一直到最後一行,條件始終沒法滿足,所以就一條資料也查不出來。
既然找到了原因,解決方法也就很明顯了,我們只要將行號查詢出來生成乙個結果集,然後再從這個結果集中,選擇行號大於我們設定的那個值就可以了,上面的分頁查詢正確的寫法應該是這樣:
selectid,name from(
selectrownum rn,u.*fromusers u)ua
whereua.rn between 3and4;
上面的語句還可以優化:>=不能用,但是<=是可以的,我們不需要在子查詢中將結果全部查出來,首先使用終止行篩選子查詢的結果,sql如下:
selectid,name from(
selectrownum rn,u.*fromusers u whererownum<=4)ua
whereua.rn >=3;
結果:很多時候,我們並不是盲目的分頁查詢的,二十按某乙個或多個欄位的公升序或降序分頁,即包含 order by 語句的分頁查詢,我們先看一下 order by 的查詢結果中rownum是怎樣的:
selectrownum,id,name fromusers order byname;
結果:可以看到,我們說行號完全是動態的,也是不準確的,這時候的行號並不是經過 order by 後新結果的增序行號。
但有了上面的巢狀查詢的經驗,這裡也可以好好應用一下,怎麼做呢:先查詢出排序好的結果集,然後應用上面的方法得到最終結果,sql如下:
selectid,name from(
(selectrownum rn,uo.*from
(select*fromusers u order byname)uo
whererownum<=4))ua
whereua.rn>=3;
按照上面的結果,正確的分頁結果應該是id為2和5的,看下結果:
ok,結果正確。
其實連表查詢之類的,也是差不多的,多點巢狀而已,掌握了原理,隨便分析一下就能寫出對應的sql了,而編寫sql時,我們也得動動腦子,畢竟sql也是由優劣之分的。
Oracle中的SQL分頁分頁
作者出處 本文分析並介紹oracle中的分頁查詢的方法。oracle中的表,除了我們建表時設計的各個字段,其實還有兩個字段 此處只介紹2個 分別是rowid 行標示符 和rownum 行號 即使我們使用describe命令檢視表的結構,也是看不到這兩個列的描述的,因為,他們其實是只在資料庫內部使用的...
ORACLE分頁查詢SQL語法
1 無order by排序的寫法。效率最高 經過測試,此方法成本最低,只巢狀一層,速度最快!即使查詢的資料量再大,也幾乎不受影響,速度依然!select from select rownum as rowno,t.from k task t where flight date between to ...
mssql 和oracle 分頁查詢的sql語句
最近在處理一些外部系統的資料庫,需要查詢是按照順序匯入到系統資料庫中,對於大資料量的處理分頁查詢不可缺少。系統中用到了兩類資料庫mssql和oracle,從網上找了語句查詢方便了程式操作。mssql with t1 as select row number over order by 主鍵 desc...