詳解SQLServer和Oracle的分頁查詢
不管是DRP中的分頁查詢代碼的實(shí)現(xiàn)還是面試題中看到的關(guān)于分頁查詢的考察,都給我一個(gè)提示:分頁查詢是重要的。當(dāng)數(shù)據(jù)量大的時(shí)候是必須考慮的。之前一直沒有花時(shí)間停下來好好總結(jié)這里?,F(xiàn)在又將Oracle視頻中關(guān)于分頁查詢的內(nèi)容看了一遍,發(fā)現(xiàn)很容易就懂了。
1.分頁算法
最開始我在網(wǎng)上查找資料的時(shí)候,看到很多分頁內(nèi)容,感覺很多很亂。其實(shí)不是這樣。網(wǎng)上那些資料大同小異。問題出在了我自己這里。我沒搞明白進(jìn)行分頁的前提是什么?我們都知道只要有分頁都會(huì)涉及這些變量:每頁又多少條記錄(pageSize)、當(dāng)前頁(pageNow)、總記錄數(shù)(totalRecords)、總頁數(shù)(totalPages)、開始頁(beginRow)、結(jié)束頁(endRow)。網(wǎng)上的那些資料分頁算法有用到pageSize的,有用到beginPage還有用到endPage.其實(shí)這些變量需要分類:我將他們分為三類:
A.需要從數(shù)據(jù)庫中查詢出來的:totalRecords. " select count(*) from tableName"
B.最基本的需要用戶提供的:pageSize和pageNow.(個(gè)人覺得這是分頁算法的前提)
C.從其他變量計(jì)算得來的:totalPages、beginRow和endRow.(這里需要計(jì)算出beginRow和endRow是由于分頁查詢中需要用到,totalPages是頁面需要提供的信息)。具體的計(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中的常用分頁方法
其實(shí)不管是Oracle還是SQLServer,實(shí)現(xiàn)分頁查詢的基礎(chǔ)都是子查詢。用我自己的話說就是:select中套select。
Oracle分頁方式有三種。我這里只講一種容易理解的。以員工表(emp)為例。假設(shè)有10條記錄,現(xiàn)在分頁要求每頁5條記錄,當(dāng)前頁為2.則查詢出來的是記錄為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表中的記錄全部查詢出來。然后我們?cè)賹⒉樵兂鰜淼慕Y(jié)果作為視圖進(jìn)一步查詢。外面的select除了查詢emp的全部以外再加一個(gè)rownum,以便后面的查詢使用。
Oracle實(shí)現(xiàn)第二步:select a.*,rownum rn from (select * from emp) a where rownum<=10 ;第二步加條件查詢出行號(hào)小于等于10的記錄。這里可能會(huì)有這樣的疑問為什么不直接寫rownum>=6 and rownum<=10.不就解決問題了。這里Oracle內(nèi)部機(jī)制不支持這種寫法。
Oracle實(shí)現(xiàn)第三步:select * from (select a.*,rownum rn from (select * from emp) a where rownum<=10) where rn>=6 ;ok,這樣就可以完成查詢6-10條記錄了。
最后。我們轉(zhuǎn)換為變量??赡苁窃趈ava程序中也可能是在pl/sql中。
需要轉(zhuǎn)換的又三個(gè):“emp”的位置為具體表名、“6”的位置 為(pageNow-1) * PageSize +1 、“10"的位置 為 pageNow * PageSize。
這種方式可以作為模板使用,修改起來很方便。所有改動(dòng)只需要改動(dòng)最里層就可以了。比如查詢指定列的情況:修改最里層select ename,sal from emp;根據(jù)薪水列排序:select ename,sal from emp order by sal;都只需要修改最里層。
3.SQLServer中的常用分頁方法
我們還是采用員工表的例子講SQLServer中分頁的實(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條記錄。這里的第一次用升序排序,第二次用降序排序是巧妙之處。沒有想到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 代替。
其他查詢都是大同小異的,這里不再贅述。
以上就是兩種數(shù)據(jù)庫實(shí)現(xiàn)分頁功能的案例,希望對(duì)大家的學(xué)習(xí)有所幫助。
- oracle,mysql,SqlServer三種數(shù)據(jù)庫的分頁查詢的實(shí)例
- Oracle實(shí)現(xiàn)分頁查詢的SQL語法匯總
- Oracle、MySQL和SqlServe三種數(shù)據(jù)庫分頁查詢語句的區(qū)別介紹
- Oracle分頁查詢性能優(yōu)化代碼詳解
- Oracle分頁查詢的實(shí)例詳解
- mysql、mssql及oracle分頁查詢方法詳解
- 詳解oracle分頁查詢的基礎(chǔ)原理
- oracle實(shí)現(xiàn)一對(duì)多數(shù)據(jù)分頁查詢篩選示例代碼
- Oracle使用MyBatis中RowBounds實(shí)現(xiàn)分頁查詢功能
- 簡(jiǎn)單實(shí)例解釋Oracle分頁查詢
相關(guān)文章
SQLServer只賦予創(chuàng)建表權(quán)限的全過程
在SQL Server中進(jìn)行各種操作是非常常見的操作,下面這篇文章主要給大家介紹了關(guān)于SQLServer只賦予創(chuàng)建表權(quán)限的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04SQL?Server數(shù)據(jù)庫創(chuàng)建遠(yuǎn)程服務(wù)器備份計(jì)劃(SQL Server2016)
最近項(xiàng)目系統(tǒng)做安全加固,以前是本地備份,現(xiàn)在需要做遠(yuǎn)程內(nèi)網(wǎng)服務(wù)器數(shù)據(jù)庫備份,后期也有可能做異地備份,下面以SQL Server2016 內(nèi)網(wǎng)服務(wù)器數(shù)據(jù)庫備份為例給大家詳細(xì)講解SQL?Server數(shù)據(jù)庫創(chuàng)建遠(yuǎn)程服務(wù)器備份計(jì)劃,感興趣的朋友一起看看吧2023-10-10SQLServer2005觸發(fā)器提示其他會(huì)話正在使用事務(wù)的上下文的解決方法
這篇文章主要介紹了SQLServer2005觸發(fā)器'提示其他會(huì)話正在使用事務(wù)的上下文的解決'方法,如果你碰到了這個(gè)問題,可以看看下面的解決方法2013-11-11sql server學(xué)習(xí)基礎(chǔ)之內(nèi)存初探
這篇文章主要給大家介紹了關(guān)于sql server中內(nèi)存的相關(guān)資料,文中通過圖文以及示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者理解sql server具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07c#連接數(shù)據(jù)庫及sql2005遠(yuǎn)程連接的方法
這篇文章主要介紹了c#連接sql數(shù)據(jù)庫及sql2005遠(yuǎn)程連接的方法,大家參考使用吧2014-01-01SQL批量插入數(shù)據(jù)幾種方案的性能詳細(xì)對(duì)比
昨天下午快下班的時(shí)候,無意中聽到公司兩位同事在探討批量向數(shù)據(jù)庫插入數(shù)據(jù)的性能優(yōu)化問題,頓時(shí)來了興趣,把自己的想法向兩位同事說了一下,于是有了本文。2010-03-03mssql server .ldf和.mdf的文件附加數(shù)據(jù)庫的sql語句
mssql server .ldf和.mdf的文件附加數(shù)據(jù)庫的sql語句...2007-07-07