sqlServer實(shí)現(xiàn)分頁查詢的三種方式
sqlServer的分頁查詢和mysql語句不一樣,有三種實(shí)現(xiàn)方式。分別是:offset /fetch next、利用max(主鍵)、利用row_number關(guān)鍵字
一、offset /fetch next關(guān)鍵字
2012版本及以上才有,SQL server公司升級(jí)后推出的新方法。
公式:
-- 分頁查詢公式-offset /fetch next select * from 表名 order by 主鍵 或 其他索引列 -- @pageIndex:頁碼、@pageSize:每頁記錄數(shù) offset ((@pageIndex-1)*@pageSize) rows fetch next @pageSize rows only;
示例:
-- 分頁查詢第2頁,每頁有10條記錄 select * from tb_user order by uid offset 10 rows fetch next 10 rows only ;
說明:
offset 10 rows ,將前10條記錄舍去,fetch next 10 rows only ,向后再讀取10條數(shù)據(jù)。
二、利用max(主鍵)
公式:
-- 分頁查詢公式-利用max(主鍵) select top @pageSize * from 表名 where 主鍵>= (select max(主鍵) from ( select top ((@pageIndex-1)*@pageSize+1) 主鍵 from 表名 order by 主鍵 asc) temp_max_ids) order by 主鍵;
示例:
-- 分頁查詢第2頁,每頁有10條記錄 select top 10 * from tb_user -- 3、再重新在這個(gè)表查詢前10條,條件: id>=max(id) where uid>= -- 2、利用max(id)得到前11條記錄中最大的id (select max(uid) from ( -- 1、先top前11條行記錄 select top 11 uid from tb_user order by uid asc) temp_max_ids) order by uid;
說明:
先top前11條行記錄,然后利用max(id)得到最大的id,之后再重新在這個(gè)表查詢前10條,不過要加上條件,where id>=max(id)。
中心思想:其實(shí)就是先得到該頁的初始id,PS:別忘了加上排序哦
三、利用row_number關(guān)鍵字
這種方式也是比較常用的,直接利用row_number() over(order by id)函數(shù)計(jì)算出行數(shù),選定相應(yīng)行數(shù)返回即可,不過該關(guān)鍵字只有在SQL server 2005版本以上才有。
公式:
-- 分頁查詢公式-row_number() select top @pageSize * from ( -- rownumber是別名,可按自己習(xí)慣取 select row_number() over(order by 主鍵 asc) as rownumber,* from 表名) temp_row where rownumber>((@pageIndex-1)*@pageSize);
示例:
-- 分頁查詢第2頁,每頁有10條記錄 select top 10 * from ( -- 子查詢,多加一個(gè)rownumber列返回 select row_number() over(order by uid asc) as rownumber,* from tb_user) temp_row --限制起始行標(biāo) where rownumber>10;
說明:
利用row_number函數(shù)給每行記錄標(biāo)了一個(gè)序號(hào),相當(dāng)于在原表中多加了1列返回。
上述示例,是以序號(hào)11為起始行,查詢前10條記錄,即為第2頁數(shù)據(jù)。

優(yōu)化:
可以看到,子查詢查詢了全表數(shù)據(jù),如果數(shù)據(jù)量大,效率是比較低的。
下面是優(yōu)化后的SQL,
公式:
-- 分頁查詢公式-row_number()-優(yōu)化版本 select * from ( -- rownumber是別名,可按自己習(xí)慣取 select top (@pageIndex*@pageSize) row_number() over(order by 主鍵 asc) as rownumber,* from 表名) temp_row where rownumber>((@pageIndex-1)*@pageSize);
示例:
-- 分頁查詢第2頁,每頁有10條記錄 select * from ( -- 子查詢,限制了返回前20條數(shù)據(jù) select top 20 row_number() over(order by uid asc) as rownumber,* from tb_user) temp_row --限制起始行標(biāo) where rownumber>10;
說明:
這里,子查詢僅查詢到當(dāng)前頁的最后一行,沒有進(jìn)行全表查詢,所以效率上要快一點(diǎn)。在外層限制起始行標(biāo),是沒變的,但是卻在內(nèi)層控制了結(jié)尾行標(biāo)。
上述示例,是以序號(hào)11為起始行,查詢20以內(nèi)的記錄,即為第2頁數(shù)據(jù)。
總結(jié)
更多介紹,可查看我的另外篇文章:SQL Server中row_number函數(shù)用法介紹
到此這篇關(guān)于sqlServer實(shí)現(xiàn)分頁查詢的三種方式的文章就介紹到這了,更多相關(guān)sqlServer分頁查詢實(shí)現(xiàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
sqlserver 臨時(shí)表 Vs 表變量 詳細(xì)介紹
說臨時(shí)表和表變量,這是一個(gè)古老的話題,我們?cè)诰W(wǎng)上也找到很多的資料闡述兩者的特征,優(yōu)點(diǎn)與缺點(diǎn)2011-11-11
SQL Server 索引結(jié)構(gòu)及其使用(一)--深入淺出理解索引結(jié)構(gòu)
深入淺出理解索引結(jié)構(gòu)2009-04-04
數(shù)據(jù)庫中identity字段不必是系統(tǒng)產(chǎn)生的唯一值 性能優(yōu)化方法(新招)
具有identity特性的字段,其值是系統(tǒng)產(chǎn)生的,自動(dòng)增加的,所以,一般把這個(gè)用在一個(gè)表的主鍵上。2011-09-09
SQL Server觸發(fā)器及觸發(fā)器中的事務(wù)學(xué)習(xí)
首先, 說下我寫篇文章的目的,我希望能把我對(duì)觸發(fā)器的理解,分享出來與你一起學(xué)習(xí)2011-05-05
SQL Server中通過reverse取某個(gè)最后一次出現(xiàn)的符號(hào)后面的內(nèi)容(字符串反轉(zhuǎn))
昨天在項(xiàng)目中遇到了一個(gè)非常簡單的問題,需要把SQL Server數(shù)據(jù)庫中保存的一段路徑地址取出其文件名,但SQL Server又沒有現(xiàn)成的方法,最后在網(wǎng)上找到這樣的一個(gè)方法,原理是先將字符串反轉(zhuǎn),取出第一個(gè)/的位置,從頭進(jìn)行截取后再次反轉(zhuǎn)2012-07-07
數(shù)據(jù)庫更新Sqlserver腳本總結(jié)
數(shù)據(jù)庫更新Sqlserver腳本總結(jié),需要的朋友可以參考下。2011-06-06
sql實(shí)現(xiàn)split函數(shù)的腳本
這篇文章主要介紹了sql實(shí)現(xiàn)split函數(shù)的腳本,大家參考使用吧2013-11-11

