<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    數據庫分頁查詢

    數據庫分頁查詢
    在這里主要講解一下MySQL、SQLServer2000(及SQLServer2005)和ORCALE三種數據庫實現分頁查詢的方法。可能會有人說這些網上都有,但我的主要目的是把這些知識通過我實際的應用總結歸納一下,以方便大家查詢使用。
    下面就分別給大家介紹、講解一下三種數據庫實現分頁查詢的方法。
    一、       MySQL 數據庫分頁查詢
    MySQL數據庫實現分頁比較簡單,提供了LIMIT函數。一般只需要直接寫到sql語句后面就行了。
    LIMIT子句可以用來限制由SELECT語句返回過來的數據數量,它有一個或兩個參數,如果給出兩個參數, 第一個參數指定返回的第一行在所有數據中的位置,從0開始(注意不是1),第二個參數指定最多返回行數。例如:
    select * from table WHERE … LIMIT 10; #返回前10行
    select * from table WHERE … LIMIT 0,10; #返回前10行
    select * from table WHERE … LIMIT 10,20; #返回第10-20行數據
     
    二、       SQLServer數據庫分頁查詢
    SQLServer數據庫又分為SQLServer2000和SQLServer2005。一般比較簡單的方法是通過TOP函數來實現。如下:
    SELECT TOP 10 * FROM sql WHERE (
    code NOT IN  (SELECT TOP 20 code  FROM TestTable  ORDER BY id))
     ORDER BY ID
    這條語句,從理論上講,整條語句的執行時間應該比子句的執行時間長,但事實相反。因為,子句執行后返回的是20條記錄,而整條語句僅返回10條語句,所以影響數據庫響應時間最大的因素是物理I/O操作。而限制物理I/O操作此處的最有效方法之一就是使用TOP關鍵詞了。TOP關鍵詞是SQL SERVER中經過系統優化過的一個用來提取前幾條或前幾個百分比數據的詞。
    以上語句的有一個致命的缺點,就是它含有NOT IN字樣,要換成用not exists來代替not in,二者的執行效率實際上是沒有區別的。
    在以上分頁算法中,影響我們查詢速度的關鍵因素有兩點:TOPNOT INTOP可以提高我們的查詢速度,而NOT IN會減慢我們的查詢速度,所以要提高我們整個分頁算法的速度,就要徹底改造NOT IN,同其他方法來替代它。
    我們知道,幾乎任何字段,我們都可以通過max(字段)min(字段)來提取某個字段中的最大或最小值,所以如果這個字段不重復,那么就可以利用這些不重復的字段的maxmin作為分水嶺,使其成為分頁算法中分開每頁的參照物。在這里,我們可以用操作符“>”“<”號來完成這個使命。如:

    Select top 10 * from table1 where id>200

      于是就有了如下分頁方案:

    select top
    頁大小 *

    from table1

    where id>

          (select max (id) from

          (select top ((
    頁碼-1)*頁大小) id from table1 order by id) as T

           )    

      order by id
     
    這種方法執行多少始終沒有大的降勢,后勁仍然很足。尤其對于數據量大的時候,該方法執行速度一點也不會降低。
    使用TOP要求主鍵必須唯一,不能是聯合主鍵。如果是聯合主鍵,則查詢出的結果會亂序的。
    目前SQLServer2005提供了一個row_number()函數。ROW_NUMBER() 就是生成一個順序的行號,而他生成順序的標準,就是后面緊跟的OVER(ORDER BY ReportID),其中ReportID可以是聯合主鍵。下面,我們看看怎么具體應用這個RowNo進行分頁.
    SELECT TOP 10 *  FROM
    (
           SELECT top 10 ROW_NUMBER() OVER (ORDER BY ReportID) AS RowNo
           FROM TABLE
          ) AS A
          WHERE RowNo > " + pageIndex*10
    pageIndex就是我們需要數據的頁數.
     
    但對于SQLServer2000的話,如果是聯合主鍵,我還沒有解決辦法,如果大家有可跟我聯系。謝謝大家了。
     
    三、       ORCALE數據庫分頁查詢
    ORCALE數據庫實現分頁查詢可以使用row_number()函數或者使用rownum 虛列兩種方法。
    第一種:利用分析函數row_number() 方法
    select * from(
    select t.*,row_number() over (order by t1.id) rowno from TABLE1
    )
    where rowno between 21 and 40;
     
    第二種:直接使用rownum 虛列
    select * from
    (select t.*,rownum as rowno from TABLE1 )
    where rowno between 10 and 20
    這兩種方法比較,顯然第二種方法比較好。因為不用order by語句,會提高檢索數據的速度的,尤其數據量越大時,第二種方法快速檢索數據越明顯。
    最后提醒大家:oracle中慎用帶有order by的分頁。尤其是在oracle10g,會出現會引起混亂,即相同記錄會出現在不同頁中。
     
    結束語:
    希望這篇文章不僅能夠給大家的工作帶來一定的幫助,也希望能讓大家能夠體會到分析問題的方法;最重要的是,希望這篇文章能夠拋磚引玉,掀起大家的學習和討論的興趣,以共同促進。還有其中紅色的字如果誰知道解決辦法請告訴我,我會盡快補上的。

    posted on 2011-08-19 16:47 SkyDream 閱讀(235) 評論(0)  編輯  收藏 所屬分類: SQL語句

    <2011年8月>
    31123456
    78910111213
    14151617181920
    21222324252627
    28293031123
    45678910

    導航

    統計

    常用鏈接

    留言簿(3)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 69视频免费观看l| 免费在线一级毛片| 亚洲成a∨人片在无码2023| 韩国二级毛片免费播放| 精品人妻系列无码人妻免费视频| 婷婷久久久亚洲欧洲日产国码AV| 国产三级在线观看免费| 一二三四在线观看免费中文在线观看 | 中文字幕久无码免费久久| 337p日本欧洲亚洲大胆艺术| 午夜成年女人毛片免费观看| 中文在线观看免费网站| 亚洲日本久久一区二区va| 久久久久亚洲AV成人网人人网站 | 最近2018中文字幕免费视频| 亚洲色偷偷综合亚洲AV伊人蜜桃| 国产精品亚洲美女久久久| 精品国产污污免费网站aⅴ| 免费一级特黄特色大片| 亚洲性69影院在线观看| 亚洲最大av无码网址| 在线a级毛片免费视频| 9久久免费国产精品特黄| 亚洲乱码中文字幕在线| 亚洲av无码成h人动漫无遮挡| 国产男女猛烈无遮挡免费视频| 久9久9精品免费观看| 思思久久99热免费精品6| 亚洲人成综合在线播放| 国产亚洲3p无码一区二区| 国产大片51精品免费观看| 亚洲成人免费电影| 久久av免费天堂小草播放| 亚洲精品无码日韩国产不卡av| 日韩亚洲AV无码一区二区不卡| 国产精品亚洲二区在线观看| 国产精品无码一二区免费| 成人女人A级毛片免费软件| 日韩精品人妻系列无码专区免费| 一个人看的免费高清视频日本| 亚洲AV无码AV吞精久久|