sql server與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是頁面需要提供的信息)。具體的計算公式:

?

這樣這些變量的值就都可以獲得了。具體怎么使用請接著看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 代替。

其他查詢都是大同小異的,這里不再贅述。

以上就是兩種數據庫實現分頁功能的案例,希望對大家的學習有所幫助。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/541351.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/541351.shtml
英文地址,請注明出處:http://en.pswp.cn/news/541351.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java treemap_Java TreeMap lastEntry()方法與示例

java treemapTreeMap類的lastEntry()方法 (TreeMap Class lastEntry() method) lastEntry() method is available in java.util package. lastEntry()方法在java.util包中可用。 lastEntry() method is used to return the entry (key-value pairs) that exists with the large…

LeetCode OJ 之 Valid Anagram

題目&#xff1a; Given two strings s and t, write a function to determine if t is an anagram of s. For example,s "anagram", t "nagaram", return true.s "rat", t "car", return false. Note: You may assume the string…

oracle光標位置無效,解決在Form表單中光標移動不了問題

apply p8727236_10123 for Developer Suite 10.1.2.3 in Linux首先到oracle的技術支持下載所需補丁,然后1先打補丁7121788&#xff0c;把p7121788_10123_LINUX.zip解壓到/home/oracledev目錄下(ORACLE_HOME為/u01/app/oracledev/OraHome_dev)$cd /home/oracledev/7121788$expo…

java treemap_Java TreeMap HigherKey()方法與示例

java treemapTreeMap類HigherKey()方法 (TreeMap Class higherKey() method) higherKey() method is available in java.util package. HigherKey()方法在java.util包中可用。 higherKey() method is used to return the lowest key value element higher than the given key e…

centos配置ipv6地址

首先打開網站注冊一個賬號&#xff1a;http://www.tunnelbroker.net創建一個ipv6的地址&#xff1a;把下面的命令在linux上執行一遍&#xff0c;這個方式是臨時生效&#xff0c;重啟網卡和重啟系統自動失效。把上面的命令保存到一個配置文件中&#xff1a;vi /etc/sysconfig/ne…

php oracle 需要libmysql.dll么_,Windows7環境下Apache+PHP+MySQL完美配置

寫作此篇文章的目的在于記錄Windows 7環境下成功配置WAMP環境, 初學者在不使用整合好的WAMPServer和XAMPP的情況下徒手配置整合環境貌似有很多意想不到的問題. 這將是我們需要討論的.我將重現幾個經典的問題, 并一一排除. 希望對各位看官有點借鑒作用.一. Apache在整合PHP后無法…

stringreader_Java StringReader skip()方法與示例

stringreaderStringReader類skip()方法 (StringReader Class skip() method) skip() method is available in java.io package. skip()方法在java.io包中可用。 skip() method is used to skip the given number of characters in the stream. skip()方法用于跳過流中給定數量的…

NFS部署及優化(一)

NFS部署及優化&#xff08;一&#xff09;一、NFS的基本概念NFS network file system 網絡文件系統必然通過網絡通信來實現文件的訪問和寫入&#xff0c;所以做這個實驗的話最好有兩臺虛擬機配置:A&#xff1a;一個192.169.50.201為server端B&#xff1a;一個192.169.50.200為…

oracle 11g跳過壞塊,oracle 使用Dbms_Repair跳過壞塊

原博文&#xff1a;http://blog.chinaunix.net/uid-77311-id-3051382.html使用Dbms_Repair跳過壞塊步驟1:表tb_test中有壞塊(模擬壞塊同方法1)SQL> select count(1) from hxl.tb_test;select count(1) from hxl.tb_test*ERROR at line 1:ORA-01578: ORACLE data block corru…

strictmath_Java StrictMath nextUp()方法與示例

strictmathStrictMath類nextUp()方法 (StrictMath Class nextUp() method) Syntax: 句法&#xff1a; public static float nextUp(float fl);public static double nextUp(double do);nextUp() method is available in java.lang package. nextUp()方法在java.lang包中可用。…

并發數據結構-1.1 并發的數據結構的設計

原文鏈接&#xff0c;譯文鏈接&#xff0c;譯者&#xff1a;董明鑫&#xff0c;校對&#xff1a;周可人 隨著多個處理器共享同一內存的機器在商業上的廣泛使用&#xff0c;并發編程的藝術也產生了巨大的變化。當前的趨勢向著低功耗芯片級多線程&#xff08;CMT&#xff09;發展…

printstream_Java PrintStream close()方法與示例

printstreamPrintStream類close()方法 (PrintStream Class close() method) close() method is available in java.io package. close()方法在java.io包中可用。 close() method is used to close the underlying output stream. close()方法用于關閉基礎輸出流。 close() meth…

oracle底層執行順序,select語句結構與執行順序-Oracle

select語句結構與執行順序select語句的結構與執行順序&#xff0c;下面的序號代表執行順序8 SELECT (9)DISTINCT11 1 ROM 3   JOIN 2   ON 4 WHERE 5 GROUP BY 6 WITH {CUBE | ROLLUP}7 HAVING 10 ORDER BY 補…

HDU 4923 Room and Moor(瞎搞題)

瞎搞題啊。找出1 1 0 0這樣的序列&#xff0c;然后存起來&#xff0c;這樣的情況下最好的選擇是1的個數除以這段的總和。然后從前向后掃一遍。變掃邊進行合并。每次合并。合并的是他的前驅。這樣到最后從t-1找出的那條鏈就是最后滿足條件的數的大小。Room and Moor Time Limit:…

java define_Java Long類的define()方法與示例

java define長類解碼()方法 (Long class decode() method) decode() method is available in java.lang package. 在java.lang包中提供了define ()方法 。 decode() method is used to decode the given String value into a Long value. encode()方法用于將給定的String值解碼…

linux修改文件用戶組,linux命令 修改文件、文件夾所屬用戶、用戶組

最近學習hadoop&#xff0c;在替換配置文件的時候&#xff0c;發現老是報錯&#xff0c;沒有權限替換。我們知道如何改變文件的用戶組與擁有者了&#xff0c;那么&#xff0c;什么時候要使用chown或chgrp呢&#xff1f;或許你會覺得奇怪吧&#xff1f;是的&#xff0c;確實有時…

Kotlin 開篇

Kotlin 是一個基于 JVM 的新的編程語言&#xff0c;由 JetBrains 開發官網地址&#xff1a;http://kotlinlang.org。JetBrains&#xff0c;作為目前廣受歡迎的 Java IDE IntelliJ 的提供商&#xff0c;在 Apache 許可下已經開源其Kotlin 編程語言。開源地址&#xff1a;https:/…

inputstream示例_Java InputStream close()方法與示例

inputstream示例InputStream類close()方法 (InputStream Class close() method) close() method is available in java.io package. close()方法在java.io包中可用。 close() method is used to close this InputStream and free all system resources linked with this stream…

linux下的文件系統,Linux根文件系統(“/”文件系統)下的目錄介紹

Linux下的文件存儲與Windows完全不同&#xff0c;Windows將系統文件存儲在系統盤(比如說C:\下)Linux根本沒有盤符到概念只有一個根文件系/&#xff0c;各個磁盤分區掛載在/media/下(或者/mnt/下)/下到如/etc,/proc,/bin,/dev,lib等很是讓用慣了Windows的用戶不解&#xff0c;下…

greenlet 詳解

greenlet初體驗回到頂部Greenlet是python的一個C擴展&#xff0c;來源于Stackless python&#xff0c;旨在提供可自行調度的‘微線程’&#xff0c; 即協程。generator實現的協程在yield value時只能將value返回給調用者(caller)。 而在greenlet中&#xff0c;target.switch&am…