您好,登錄后才能下訂單哦!
今天小編給大家分享一下sqlServer實現分頁查詢的方式有哪些的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
sqlServer的分頁查詢和mysql語句不一樣,有三種實現方式。分別是:offset /fetch next、利用max(主鍵)、利用row_number關鍵字
2012版本及以上才有,SQL server公司升級后推出的新方法。
公式:
-- 分頁查詢公式-offset /fetch next select * from 表名 order by 主鍵 或 其他索引列 -- @pageIndex:頁碼、@pageSize:每頁記錄數 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條數據。
公式:
-- 分頁查詢公式-利用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() over(order by id)函數計算出行數,選定相應行數返回即可,不過該關鍵字只有在SQL server 2005版本以上才有。
公式:
-- 分頁查詢公式-row_number() select top @pageSize * from ( -- rownumber是別名,可按自己習慣取 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函數給每行記錄標了一個序號,相當于在原表中多加了1列返回。
上述示例,是以序號11為起始行,查詢前10條記錄,即為第2頁數據。
優化:
可以看到,子查詢查詢了全表數據,如果數據量大,效率是比較低的。
下面是優化后的SQL,
公式:
-- 分頁查詢公式-row_number()-優化版本 select * from ( -- rownumber是別名,可按自己習慣取 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條數據 select top 20 row_number() over(order by uid asc) as rownumber,* from tb_user) temp_row --限制起始行標 where rownumber>10;
說明:
這里,子查詢僅查詢到當前頁的最后一行,沒有進行全表查詢,所以效率上要快一點。在外層限制起始行標,是沒變的,但是卻在內層控制了結尾行標。
上述示例,是以序號11為起始行,查詢20以內的記錄,即為第2頁數據。
以上就是“sqlServer實現分頁查詢的方式有哪些”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。