詳解SQLServer和Oracle的分頁查詢。本站提示廣大學習愛好者:(詳解SQLServer和Oracle的分頁查詢)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解SQLServer和Oracle的分頁查詢正文
不論是DRP中的分頁查詢代碼的完成照樣面試題中看到的關於分頁查詢的考核,都給我一個提醒:分頁查詢是主要的。當數據量年夜的時刻是必需斟酌的。之前一向沒有花時光停上去好好總結這裡。如今又將Oracle視頻中關於分頁查詢的內容看了一遍,發明很輕易就懂了。
1.分頁算法
最開端我在網上查找材料的時刻,看到許多分頁內容,感到許多很亂。其實不是如許。網上那些材料年夜同小異。成績出在了我本身這裡。我沒弄明確停止分頁的條件是甚麼?我們都曉得只需有分頁都邑觸及這些變量:每頁又若干筆記錄(pageSize)、以後頁(pageNow)、總記載數(totalRecords)、總頁數(totalPages)、開端頁(beginRow)、停止頁(endRow)。網上的那些材料分頁算法有效到pageSize的,有效到beginPage還有效到endPage.其實這些變量須要分類:我將他們分為三類:
A.須要從數據庫中查詢出來的:totalRecords. " select count(*) from tableName"
B.最根本的須要用戶供給的:pageSize和pageNow.(小我認為這是分頁算法的條件)
C.從其他變量盤算得來的:totalPages、beginRow和endRow.(這裡須要盤算出beginRow和endRow是因為分頁查詢中須要用到,totalPages是頁面須要供給的信息)。詳細的盤算公式:
totalPages: if ((totalRecords% pageSize) == 0) { totalPages = totalRecords/ pageSize; } else { totalPages = totalRecords/ pageSize + 1; } beginRow: (pageNow-1) * PageSize +1 endRow: pageNow * PageSize
如許這些變量的值就都可以取得了。詳細怎樣應用請接著看2和3部門。
2.Oracle中的經常使用分頁辦法
其實不論是Oracle照樣SQLServer,完成分頁查詢的基本都是子查詢。用我本身的話說就是:select中套select。
Oracle分頁方法有三種。我這裡只講一種輕易懂得的。以員工表(emp)為例。假定有10筆記錄,如今分頁請求每頁5筆記錄,以後頁為2.則查詢出來的是記載為6-10。我們先器具體的數字做,然後再換成變量。
Oracle完成第一步:select a.*,rownum rn from (select * from emp) a;個中rownum是Oracle外部分派行號。括號中的select * from emp是將emp表中的記載全體查詢出來。然後我們再將查詢出來的成果作為視圖進一步查詢。裡面的select除查詢emp的全體之外再加一個rownum,以便前面的查詢應用。
Oracle完成第二步:select a.*,rownum rn from (select * from emp) a where rownum<=10 ;第二步加前提查詢出行號小於等於10的記載。這裡能夠會有如許的疑問為何不直接寫rownum>=6 and rownum<=10.不就處理成績了。這裡Oracle外部機制不支撐這類寫法。
Oracle完成第三步:select * from (select a.*,rownum rn from (select * from emp) a where rownum<=10) where rn>=6 ;ok,如許便可以完成查詢6-10筆記錄了。
最初。我們轉換為變量。能夠是在java法式中也能夠是在pl/sql中。
須要轉換的又三個:“emp”的地位為詳細表名、“6”的地位 為(pageNow-1) * PageSize +1 、“10"的地位 為 pageNow * PageSize。
這類方法可以作為模板應用,修正起來很便利。一切修改只須要修改最裡層便可以了。好比查詢指定列的情形:修正最裡層select ename,sal from emp;依據薪水列排序:select ename,sal from emp order by sal;都只須要修正最裡層。
3.SQLServer中的經常使用分頁辦法
我們照樣采取員工表的例子講SQLServer平分頁的完成
第一種TOP的應用:
SQLServer完成第一步:select top 10 * from emp order by empid ;依照員工ID升序分列,掏出前10筆記錄。
SQLServer完成第二步:select top 5* from (select top 10 * from emp order by empid ) a order by empid desc 。將掏出的10筆記錄按員工號降序分列再掏出5筆記錄。這裡的第一次用升序排序,第二次用降序排序是奇妙的地方。沒有想到top能起到如許的後果。這裡的10的地位用變量pageNow * PageSize取代而5用PageSize 取代。
第二種Top和In的應用:
select top 5 * from emp where empid in (select top 10 empid from emp order by empid) order by empid desc; 這裡的10的地位用變量pageNow * PageSize取代而5用PageSize 取代。
其他查詢都是年夜同小異的,這裡不再贅述。
以上就是兩種數據庫完成分頁功效的案例,願望對年夜家的進修有所贊助。