1. 程式人生 > >幾種常見SQL分頁方式

幾種常見SQL分頁方式



第一種方法:效率最高

[sql]  view plain  copy
  1. SELECT TOP 頁大小 *   
  2. FROM   
  3.     (  
  4.         SELECT ROW_NUMBER() OVER (
    ORDER BY id) AS RowNumber,* FROM table1  
  5.     )   as A    
  6. WHERE RowNumber > 頁大小*(當前頁-1)   
  7.   
  8. --註解:首先利用Row_number()為table1表的每一行新增一個行號,給行號這一列取名'RowNumber' 在over()方法中將'RowNumber'做了升序排列
      
  9. --然後將'RowNumber'列 與table1表的所有列 形成一個表A  
  10. --重點在where條件。假如當前頁(currentPage)是第2頁,每頁顯示10個數據(pageSzie)。那麼第一頁的資料就是第11-20條  
  11. --所以為了顯示第二頁的資料,即顯示第11-20條資料,那麼就讓RowNumber大於 10*(2-1) 即:頁大小*(當前頁-1)  

將上面的方法寫成儲存過程 (表名Location)

[sql]
  view plain  copy
  1. if(exists(selectfrom sys.procedures where name='p_location_paging'))--如果p_location_paging這個儲存過程存在  
  2. drop proc p_location_paging  --那麼就刪除這個儲存過程  
  3. go  
  4. create proc p_location_paging(@pageSize int, @currentPage int)--建立儲存過程,定義兩個變數'每頁顯示的條數'和'當前頁'  
  5. as  
  6. select  top (@pageSize) * from (  
  7. select ROW_NUMBER() over(order by locid) as rowid ,* from location   
  8. )as A  
  9. where rowid> (@pageSize)*((@currentPage)-1)  

簡單的說row_number()從1開始,為每一條分組記錄返回一個數字


第二種方法:效率次之

[sql]  view plain  copy
  1. SELECT TOP 頁大小 *  --如果每頁顯示10條資料,那麼這裡就是查詢10條資料  
  2. FROM table1  
  3. WHERE id >  --假如當前頁為第三頁,那麼就需要查詢21-30條資料,即:id>20  
  4.         (  
  5.             SELECT ISNULL(MAX(id),0)  --查詢子查詢中最大的id  
  6.             FROM   
  7.                 (  
  8.                     SELECT TOP 頁大小*(當前頁-1) id FROM table1 ORDER BY id --因為當前頁是第三頁,每頁顯示十條資料。那麼我將: 頁大小*(當前頁-1),就是獲取到了在"當前頁""前面"的20條資料。所以上面用max(id)查詢最大的id,取到這個20,那麼前面的where 條件的id>20 即取到了第三頁的資料,即取21-30條資料  
  9.                 ) as A  
  10.            )  
  11. ORDER BY id  

將上面的方法寫成儲存過程:表名Location

[sql]  view plain  copy
  1. if(exists(select * from sys.procedures where name='p_location_paging'))  
  2. drop proc p_location_paging  
  3. go  
  4. create proc p_location_paging(@pageSize int ,@currentPage int)  
  5. as  
  6. select  top (@pageSize) * from location  
  7. where locId>(select ISNULL(MAX(locId),0)  
  8. from (select top ((@pageSize)*(@currentPage-1))locid from location  order by locId) as a  
  9. )  
  10. order by locId  

第三種方法:效果最差

[sql]  view plain  copy
  1. SELECT TOP 頁大小 *  
  2. FROM table1  
  3. WHERE id NOT IN --where條件語句限定要查詢的資料不是子查詢裡面包含的資料。即查詢"子查詢"後面的10條資料。即當前頁的資料  
  4.         (  
  5.            --如果當前頁是第二頁,每頁顯示10條資料,那麼這裡就是獲取當前頁前面的所有資料。  
  6.            SELECT TOP 頁大小*(當前頁-1) id FROM table1 ORDER BY id  
  7.         )  
  8. ORDER BY id  

在知道總的資料量,及每頁顯示多少條資料後。計算總的頁數

<1> 即便資料總的條數為0。也顯示一頁; 即:總頁數=1

[csharp]  view plain  copy
  1. int dataCount; //資料的總的條數  
  2. int pageSize;  //每頁顯示多少條資料  
  3. int pageCount; //總的頁數  
  4. pageCount = dataCount % pageSize == 0 ? ((dataCount - pageSize >= 0 ? (dataCount / pageSize) : 1)) : dataCount / pageSize + 1;  
  5.   
  6. //上面這句話分解一下就是:  
  7. if(dataCount%pageSize==0)   
  8. {  
  9.     if(dataCount-pageSize>=0) //即if(dataCount>pageSize)  
  10.     {  
  11.         pageCount=dataCount/pageSize;  
  12.     }  
  13.     else  
  14.     {  
  15.         pageCount=1; //假如資料的總條數只有8條資料。而每頁顯示10條資料;也就是說8%10的結果是等於0的。但是既然有8條資料,我也需要用1頁來顯示這8條資料。所有就有這個條件:即:即便dataCount%pageSize==0的時候,在dataCount<pageSize的情況下,總頁數PageCount最少也得有一頁吧!所以這裡就將pageCount設為1了。  
  16.     }  
  17.   
  18. }  
  19. else  
  20. {  
  21.     dataCount=(dataCount/pageSize)+1;  
  22. }  

<2>如果資料總條數為0。連一頁都不需要顯示;即:總頁數=0

[csharp]  view plain  copy
  1. int dataCount; //資料的總的條數  
  2. int pageSize;  //每頁顯示多少條資料  
  3. int pageCount; //總的頁數  
  4.  pageCount = dataCount % pageSize == 0 ? ((dataCount - pageSize >= 0 ? (dataCount / pageSize) : (dataCount==0?0:1))) : dataCount / pageSize + 1;  
  5.   
  6. //上面這句話分解一下就是:  
  7. if(dataCount%pageSize==0)   
  8. {  
  9.     if(dataCount-pageSize>=0) //即if(dataCount>pageSize)  
  10.     {  
  11.         pageCount=dataCount/pageSize;  
  12.     }  
  13.     if(dataCount=0)  
  14.     {  
  15.         pageCount=0; //相比上面那個計算總頁數,這裡多了這麼一條判斷。如果連一條資料都沒有的情形下,我連一頁都不需要顯示,即:讓總頁數為0,  
  16.     }  
  17.     else  
  18.     {  
  19.         pageCount=1; //假如資料的總條數只有8條資料。而每頁顯示10條資料;也就是說8%10的結果是等於0的。但是既然有8條資料,我也需要用1頁來顯示這8條資料。所有就有這個條件:即:即便dataCount%pageSize==0的時候,在dataCount<pageSize的情況下,總頁數PageCount最少也得有一頁吧!所以這裡就將pageCount設為1了。  
  20.     }  
  21.   
  22. 相關推薦

    常見SQL方式效率比較

    har n) over mage 適用於 not blog toolbar 大數 1.創建測試環境,(插入100萬條數據大概耗時5分鐘)。 create database DBTestuse DBTest--創建測試表create table pagetest(id

    常見SQL方式

    第一種方法:效率最高 [sql]  view plain  copy SELECT TOP 頁大小 *   

    JavaScript的常見的創建方式

    自定義 圖片 () 屬性 創建方式 return語句 bubuko 之前 object 1.通過Object構造函數或者對象字面量創建單個對象 使用字面量方法創建對象:var stut = {name: "張三"}; 使用內置構造函數創建對象:var stu = new O

    css3常見的翻特效

    翻頁特效   html: <div class="book preserve-3d"> <div class="now_page point"> <div class="book-page"> <p&g

    執行緒池的常見的建立的方式

    一:建立大小不固定的執行緒池 二:建立固定數量執行緒的執行緒池 三:建立單執行緒的執行緒池 四:建立定時執行緒 1.建立大小不固定的執行緒池 package com.peace.pms.Test; import java.util.concurrent.Execu

    常見的程式設計命名方式

    一、匈牙利命名法【Hungarian】: 廣泛應用於象 Microsoft Windows 這樣的環境中。 Windows 程式設計中用到的變數(還包括巨集)的命名規則匈牙利命名法, 這種命名技術是由一 位能幹的 Microsoft 程式設計師查爾斯· 西蒙尼(Charl

    Java中常用的

    ... List<StudentEnroll> students = studentlDao.getAllStudents(); int count = 0; if(studentEnrolls != null && studentEnrolls.s

    常見彈窗表達方式

    window.open 彈出新視窗的命令;  'page.html' 彈出視窗的檔名;  'newwindow' 彈出視窗的名字(不是檔名),非必須,可用空''代替;    height=100 視窗高度;    width=400 視窗寬度;    top=0 視窗距離螢幕上方的象素值;    

    常見方式

    1.概念 物理分頁:利用資料庫本身提供的分頁方式,如mysql的limit,oracle的rownum,好處是效率高,不好的地方就是不同的資料庫有不同的搞法。如hibernate採用的是物理分頁。 邏輯分頁:利用遊標分頁,好處是資料庫相容,壞處是效率太低。 真分頁:確定要顯

    常用的技術

    二.物理分頁利用資料庫本身的一些特性來分頁。即:利用了資料庫對sql語法的優化,提高分頁效能。1.針對Oracle資料庫步驟如下:a.根據所使用的資料庫特性來組織sql進行分頁。b.每次跳轉頁面的sql查詢都不相同。 通用的sql分頁方式,“限制行數結果集的倒序”分頁,步驟如下: (1).取得符合條件的所有結

    常見的木馬啟動方式

      木馬是隨計算機或Windows的啟動而啟動並掌握一定的控制權的,其啟動方式可謂多種多樣,通過登錄檔啟動、通過System.ini啟動、通過某些特定程式啟動等,真是防不勝防。其實只要能夠遏制住不讓它啟動,木馬就沒什麼用了,這裡就簡單說說木馬的啟動方式,知己知彼百戰不殆嘛。

    網站安全之常見的網路攻擊方式

     * syn flood: 一個使用者向伺服器傳送syn報文後,如果伺服器在發出sys+ack報文後無法收到客戶端ack報文,這種情況下伺服器端一般會重試(再次傳送syn+ack給客戶端),並等待

    【乾貨】SqlServer 總結儲存過程的使用

    就我而言寫程式碼最煩的就是處理資料,其中之一就是分頁的使用。 有的程式碼寫多了,總結出一套適用自己的分頁方法;有的查一下資料借鑑一下套用起來也達到目的。 那麼小編在這裡給大家總結幾個方法供大家做一下參考。 分頁方法一: SET ANSI_NULLS ON GO SET QUOTED_IDENT

    SQL查詢的方式

    但是 order 結果 htm sql分頁 sele esc 註意 介紹 https://www.cnblogs.com/lxhbky/p/5962393.html 需求:查詢表dbo.Message,每頁10條,查詢第2頁 1:TOP() SELECT TOP(2

    Asp.Net中的三方式總結

    rom chang clas 綁定 select proc dll xtend tinc 本人ASP.net初學,網上找了一些分頁的資料,看到這篇文章,沒看到作者在名字,我轉了你的文章,只為我可以用的時候方便查看,2010的文章了,不知道這技術是否過期。 以下才是正文

    Vue2 常見開局方式

    fig elm temp common disable .... false app oot 在SF問題中看到了一個關於vue-cli中的template問題,問題是這樣的:用vue-cli工具生成的main.js中: import Vue from ‘vue‘ i

    第四節課:常見的攻擊方式

    pxc wql ptc hvm oid hsv ffd stl -1 1.中間人攻擊 局域網ARP攻擊 受害者經過攻擊者向網關發送數據。當主機A、和主機B通信時,都由主機C來為其“轉發”,如圖一,而A、B之間並沒有真正意思上的直接通信,他們之間的信息傳遞同C作為中介來完成

    Java常見的編碼方式

    計算 是把 oca java 編碼 不同 sta 換上 基礎上 examples 幾種常見的編碼格式 為什麽要編碼 不知道大家有沒有想過一個問題,那就是為什麽要編碼?我們能不能不編碼?要回答這個問題必須要回到計算機是如何表示我們人類能夠理解的符號的,這些符號也就是我們人類

    sqlserver的四方式

    pro 支持 分享 class eat cnblogs ext 5 學習 log 第一種:ROW_NUMBER() OVER()方式 select * from (     select *, ROW_NUMBER() OVER(Order by ArtistId )

    分庫表的常見玩法及如何解決跨庫查詢等問題

    時間 擔憂 idt web 分布 rpc sharding har 安全性 在談論數據庫架構和數據庫優化的時候,我們經常會聽到“分庫分表”、“分片”、“Sharding”…這樣的關鍵詞。讓人感到高興的是,這些朋友所服務的公司業務量正在(或者即將面臨)高速增長,技術方面也面臨