sqlServer實現(xiàn)分頁查詢的三種方式
sqlServer的分頁查詢和mysql語句不一樣,有三種實現(xiàn)方式。分別是:offset /fetch next、利用max(主鍵)、利用row_number關(guān)鍵字
一、offset /fetch next關(guān)鍵字
2012版本及以上才有,SQL server公司升級后推出的新方法。
公式:
-- 分頁查詢公式-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、再重新在這個表查詢前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,之后再重新在這個表查詢前10條,不過要加上條件,where id>=max(id)。
中心思想:其實就是先得到該頁的初始id,PS:別忘了加上排序哦
三、利用row_number關(guān)鍵字
這種方式也是比較常用的,直接利用row_number() over(order by id)函數(shù)計算出行數(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 ( -- 子查詢,多加一個rownumber列返回 select row_number() over(order by uid asc) as rownumber,* from tb_user) temp_row --限制起始行標 where rownumber>10;
說明:
利用row_number函數(shù)給每行記錄標了一個序號,相當于在原表中多加了1列返回。
上述示例,是以序號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 --限制起始行標 where rownumber>10;
說明:
這里,子查詢僅查詢到當前頁的最后一行,沒有進行全表查詢,所以效率上要快一點。在外層限制起始行標,是沒變的,但是卻在內(nèi)層控制了結(jié)尾行標。
上述示例,是以序號11為起始行,查詢20以內(nèi)的記錄,即為第2頁數(shù)據(jù)。
總結(jié)
更多介紹,可查看我的另外篇文章:SQL Server中row_number函數(shù)用法介紹
到此這篇關(guān)于sqlServer實現(xiàn)分頁查詢的三種方式的文章就介紹到這了,更多相關(guān)sqlServer分頁查詢實現(xiàn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
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)生的,自動增加的,所以,一般把這個用在一個表的主鍵上。2011-09-09
SQL Server觸發(fā)器及觸發(fā)器中的事務(wù)學(xué)習(xí)
首先, 說下我寫篇文章的目的,我希望能把我對觸發(fā)器的理解,分享出來與你一起學(xué)習(xí)2011-05-05
SQL Server中通過reverse取某個最后一次出現(xiàn)的符號后面的內(nèi)容(字符串反轉(zhuǎn))
昨天在項目中遇到了一個非常簡單的問題,需要把SQL Server數(shù)據(jù)庫中保存的一段路徑地址取出其文件名,但SQL Server又沒有現(xiàn)成的方法,最后在網(wǎng)上找到這樣的一個方法,原理是先將字符串反轉(zhuǎn),取出第一個/的位置,從頭進行截取后再次反轉(zhuǎn)2012-07-07
數(shù)據(jù)庫更新Sqlserver腳本總結(jié)
數(shù)據(jù)庫更新Sqlserver腳本總結(jié),需要的朋友可以參考下。2011-06-06

