佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > 詳解SQLServer和Oracle的分頁(yè)查詢(xún)

詳解SQLServer和Oracle的分頁(yè)查詢(xún)

熱門(mén)標(biāo)簽:Linux服務(wù)器 服務(wù)外包 地方門(mén)戶(hù)網(wǎng)站 百度競(jìng)價(jià)排名 鐵路電話系統(tǒng) 網(wǎng)站排名優(yōu)化 呼叫中心市場(chǎng)需求 AI電銷(xiāo)

不管是DRP中的分頁(yè)查詢(xún)代碼的實(shí)現(xiàn)還是面試題中看到的關(guān)于分頁(yè)查詢(xún)的考察,都給我一個(gè)提示:分頁(yè)查詢(xún)是重要的。當(dāng)數(shù)據(jù)量大的時(shí)候是必須考慮的。之前一直沒(méi)有花時(shí)間停下來(lái)好好總結(jié)這里?,F(xiàn)在又將Oracle視頻中關(guān)于分頁(yè)查詢(xún)的內(nèi)容看了一遍,發(fā)現(xiàn)很容易就懂了。

1.分頁(yè)算法
    最開(kāi)始我在網(wǎng)上查找資料的時(shí)候,看到很多分頁(yè)內(nèi)容,感覺(jué)很多很亂。其實(shí)不是這樣。網(wǎng)上那些資料大同小異。問(wèn)題出在了我自己這里。我沒(méi)搞明白進(jìn)行分頁(yè)的前提是什么?我們都知道只要有分頁(yè)都會(huì)涉及這些變量:每頁(yè)又多少條記錄(pageSize)、當(dāng)前頁(yè)(pageNow)、總記錄數(shù)(totalRecords)、總頁(yè)數(shù)(totalPages)、開(kāi)始頁(yè)(beginRow)、結(jié)束頁(yè)(endRow)。網(wǎng)上的那些資料分頁(yè)算法有用到pageSize的,有用到beginPage還有用到endPage.其實(shí)這些變量需要分類(lèi):我將他們分為三類(lèi)
    A.需要從數(shù)據(jù)庫(kù)中查詢(xún)出來(lái)的:totalRecords. " select count(*) from tableName"
    B.最基本的需要用戶(hù)提供的:pageSize和pageNow.(個(gè)人覺(jué)得這是分頁(yè)算法的前提)
    C.從其他變量計(jì)算得來(lái)的:totalPages、beginRow和endRow.(這里需要計(jì)算出beginRow和endRow是由于分頁(yè)查詢(xún)中需要用到,totalPages是頁(yè)面需要提供的信息)。具體的計(jì)算公式:

totalPages: if ((totalRecords% pageSize) == 0) {  
             totalPages = totalRecords/ pageSize;  
           } else {  
             totalPages = totalRecords/ pageSize + 1;  
           } 
beginRow: (pageNow-1) * PageSize +1 
endRow:   pageNow * PageSize 

這樣這些變量的值就都可以獲得了。具體怎么使用請(qǐng)接著看2和3部分。

2.Oracle中的常用分頁(yè)方法
   其實(shí)不管是Oracle還是SQLServer,實(shí)現(xiàn)分頁(yè)查詢(xún)的基礎(chǔ)都是子查詢(xún)。用我自己的話說(shuō)就是:select中套select。
   Oracle分頁(yè)方式有三種。我這里只講一種容易理解的。以員工表(emp)為例。假設(shè)有10條記錄,現(xiàn)在分頁(yè)要求每頁(yè)5條記錄,當(dāng)前頁(yè)為2.則查詢(xún)出來(lái)的是記錄為6-10。我們先用具體的數(shù)字做,然后再換成變量。
   Oracle實(shí)現(xiàn)第一步:select a.*,rownum rn from (select * from emp) a;其中rownum是Oracle內(nèi)部分配行號(hào)。括號(hào)中的select * from emp是將emp表中的記錄全部查詢(xún)出來(lái)。然后我們?cè)賹⒉樵?xún)出來(lái)的結(jié)果作為視圖進(jìn)一步查詢(xún)。外面的select除了查詢(xún)emp的全部以外再加一個(gè)rownum,以便后面的查詢(xún)使用。
   Oracle實(shí)現(xiàn)第二步:select a.*,rownum rn from (select * from emp) a where rownum=10 ;第二步加條件查詢(xún)出行號(hào)小于等于10的記錄。這里可能會(huì)有這樣的疑問(wèn)為什么不直接寫(xiě)rownum>=6 and rownum=10.不就解決問(wèn)題了。這里Oracle內(nèi)部機(jī)制不支持這種寫(xiě)法。
   Oracle實(shí)現(xiàn)第三步:select * from (select a.*,rownum rn from (select * from emp) a where rownum=10) where rn>=6 ;ok,這樣就可以完成查詢(xún)6-10條記錄了。
   最后。我們轉(zhuǎn)換為變量??赡苁窃趈ava程序中也可能是在pl/sql中。
   需要轉(zhuǎn)換的又三個(gè):“emp”的位置為具體表名、“6”的位置  為(pageNow-1) * PageSize +1 、“10"的位置 為 pageNow * PageSize。
   這種方式可以作為模板使用,修改起來(lái)很方便。所有改動(dòng)只需要改動(dòng)最里層就可以了。比如查詢(xún)指定列的情況:修改最里層select ename,sal from emp;根據(jù)薪水列排序:select ename,sal from emp order by sal;都只需要修改最里層。

3.SQLServer中的常用分頁(yè)方法
   我們還是采用員工表的例子講SQLServer中分頁(yè)的實(shí)現(xiàn)
   第一種TOP的使用:
SQLServer實(shí)現(xiàn)第一步:select top 10 * from emp order by empid ;按照員工ID升序排列,取出前10條記錄。
SQLServer實(shí)現(xiàn)第二步:select top 5* from (select top 10 * from emp order by empid ) a order by empid desc 。將取出的10條記錄按員工號(hào)降序排列再取出5條記錄。這里的第一次用升序排序,第二次用降序排序是巧妙之處。沒(méi)有想到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 代替。
   其他查詢(xún)都是大同小異的,這里不再贅述。

以上就是兩種數(shù)據(jù)庫(kù)實(shí)現(xiàn)分頁(yè)功能的案例,希望對(duì)大家的學(xué)習(xí)有所幫助。

您可能感興趣的文章:
  • oracle,mysql,SqlServer三種數(shù)據(jù)庫(kù)的分頁(yè)查詢(xún)的實(shí)例
  • Oracle實(shí)現(xiàn)分頁(yè)查詢(xún)的SQL語(yǔ)法匯總
  • Oracle、MySQL和SqlServe三種數(shù)據(jù)庫(kù)分頁(yè)查詢(xún)語(yǔ)句的區(qū)別介紹
  • Oracle分頁(yè)查詢(xún)性能優(yōu)化代碼詳解
  • Oracle分頁(yè)查詢(xún)的實(shí)例詳解
  • mysql、mssql及oracle分頁(yè)查詢(xún)方法詳解
  • 詳解oracle分頁(yè)查詢(xún)的基礎(chǔ)原理
  • oracle實(shí)現(xiàn)一對(duì)多數(shù)據(jù)分頁(yè)查詢(xún)篩選示例代碼
  • Oracle使用MyBatis中RowBounds實(shí)現(xiàn)分頁(yè)查詢(xún)功能
  • 簡(jiǎn)單實(shí)例解釋Oracle分頁(yè)查詢(xún)

標(biāo)簽:湘潭 銅川 蘭州 仙桃 衡水 崇左 湖南 黃山

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《詳解SQLServer和Oracle的分頁(yè)查詢(xún)》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢(xún)

    • 400-1100-266
    通渭县| 田阳县| 满城县| 池州市| 博兴县| 东海县| 武功县| 志丹县| 雅安市| 东辽县| 鹤山市| 宜兰县| 安多县| 额尔古纳市| 岗巴县| 莫力| 阳高县| 古田县| 潮安县| 宜黄县| 安阳县| 兴宁市| 花垣县| 博罗县| 滨州市| 舟山市| 于田县| 涪陵区| 清流县| 星座| 武安市| 永仁县| 始兴县| 江山市| 巴南区| 南开区| 合江县| 墨竹工卡县| 晋城| 河津市| 凉城县|