ORACLE 分頁查詢

2021-09-30 00:04:57 字數 4104 閱讀 1829

分頁查詢就是將查詢表中的資料時進行分段,而不是一次性把所有的資料都查詢出來,有時候查詢的資料量非常大,會導致系統資源消耗大,響應速度慢,資料冗餘嚴重,為此遇到這種情況一般就使用分頁查詢解決,資料庫基本都支援分頁,但是不同的資料庫語法不同。

oracle中的分頁是基於偽列rownum實現的,為查詢出來的每一行資料都編個行號。rownum不存在任何一張表中,但是所有的表都可以查詢這個字段,這個欄位的值是隨著查詢自動生成的。

方式:每當可以從表中查詢出一條記錄的時候,那麼這個欄位的值為該條記錄的行號,從1開始的,依次遞增。

select rownum,empno,ename,sal,job from emp;

select rownum,empno,ename,sal,job from emp where rownum >1;–沒有資料

select rownum,empno,ename,job,sal from emp where rownum between 6 and 10; --沒有資料

在使用rownum對結果集進行編號的查詢過程中不能夠使用rownum做大於1以上的判斷,因為rownum第一次查詢的時候,此時rounum=1,where過濾條件不成立,就沒有對第一行進行編號。依次向下推理,編號都不成立,就無法查詢出一條資料。等於1就只有第一條資料,>0沒有什麼意義。

解決方法:1先使用rownum進行編號,對結果集當做表

2對結果集裡面的編號欄位名(rownum)進行過濾

但是此時要對結果集中rownum新增別名,否則不寫別名的話計算機會把過濾條件中的rownum當做偽列,與第一步的結果集的偽列無關。因此就要採用別名,進行區分。

select * from (select rownum rn,empno,ename,sal,job from emp) se where se.rn between 6 and 10 ;
--檢視公司員工工資排名的第6-10名

select * from

(select rownum rn, empno,ename,sal from emp) t

where t.rn between 6 and 10 order by sal desc;

無論order by是放在括號裡面還是查詢語句最後都是錯誤的,都不能查出想要的結果集。是因為order by是最後才執行的,而我們的要求是先排序後取出資料。

解決方法分析: 1.首先對工資排序,將工資排序後的結果集當做表

2.對錶新增rownum偽列對記錄編號。

3.此時就可以新增過濾條件,對第6-10名進行查詢

select * from (

select rownum rn,t.* from (

select empno,ename,sal from emp order by sal desc

) t ) where t.rn between 6 and 10;

為了提高效率,如果只要取6-10的資料,那麼意味著10之後的資料就不需要進行編號。 rownum可以做小於判斷:

select * from (

select rownum rn,t.* from (

select empno,ename,sal from emp order by sal desc) t where rownum<=10)

where rn>=6;

計算區間的公式:

pagesize:每頁顯示的條目數 5

page:頁數 2

start:(page-1)pagesize+1 6

end:pagesizepage 10

int start = (page-1)pagesize+1;

int end = pagesizepage ;

string sql = "select * from "+

+" (select rownum rn, t.* from "+

+"(select empno,ename,sal from emp order by sal desc) t where rownum<="+end+")"+

+" where rn>="+start;

如果a1的值等於a2的值,則返回a3

–如果a1的值不等於a2的值,再去比較a4,如果和a4相同,則返回a5

–職位等於manager 漲工資百分之20

–職位等於analyst 漲工資百分之10

–職位等於salesman 漲工資百分之5

select ename,job,sal,decode(job,

'manager',sal*1.2,

'analyst',sal*1.1,

'salesman',sal*1.05,

sal

)bonus from emp;

當所有引數都不滿足的情況,就返回預設值sal的值。如果沒有給預設值,則返回null

decode函式在group by分組中應用,可以將字段值不同的記錄看成一組。

——統計人數,將職位是』manager』,『salesman』 看成一組,其餘職位的看成另一組

);這條查詢語句decode的結果是將職位是』manager』,'salesman』改為vip,再通過group by 也就可以將這兩個職位看成一組,從而可以統計出這兩種職業的人數。

與decode功能一樣,但是其語法結構更複雜一些。

關鍵字:case job when then else end

select ename,job,sal,

case job when 'manager' then sal*1.2

when 'analyst' then sal*1.1

when 'salesman' then sal*1.05

else sal

end

bonus from emp;

對上述補充:then後面不需要新增逗號,else後面跟的是預設值,以end進行結尾,bonus是case語句的別名。

允許對結果集按照指定的字段分組,在組內再按照指定的字段排序,最終生成組內編號。

(1)row_number()生成組內連續且唯一的數字

(2)rank():生成組內不連續也不唯一的數字,通組內排序字段值一樣的記錄,生成數字也一樣

select ename,sal,deptno,rank() over(partition by deptno order by sal desc) from emp;
(3)dense_rank():生成組內連續但不唯一的數

ORACLE分頁查詢

單錶分頁 start num 起始行號 end num 截止行號 select t.from select s.rownum rn from table s where rownum end num t where rn start num 多表分頁 select from select temp....

Oracle分頁查詢

oracle的分頁查詢語句基本上可以按照本文給出的格式來進行套用。分頁查詢格式 select from select a.rownum rn from select from table name a where rownum 40 where rn 21 其中最內層的查詢select from t...

oracle 分頁查詢

1 要把rowid來分 select from t xiaoxi where rowid in select rid from select rownum rn,rid from select rowid rid,cid from t xiaoxi order by cid desc where r...