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