很久沒更新了,最近忙的很,也生病了,重感冒,555~~~數據庫
早上抽的一絲空閒,來說講SqlServer中的分頁問題。其實用過了多種數據庫,分頁這問題已是老生常談的問題了。無論是開發什麼類型的網站,只要是包含檢索功能的,不外乎會涉及到分頁的問題。函數
好比Oracle中的分頁:網站
select * from (select a.*,rownum rc from 表名 where rownum<=endrow) a where a.rc>=startrowspa
select a1.* from (select student.*,rownum rn from student) a1 where rn between startpage and endpage;(使用較多)開發
DB2中的分頁:table
Select * from (select rownumber() over() as rc,a.* from (select * from 表名 order by 列名) as a) where rc between startrow and endrowclass
MySQL中的分頁:(感受是全部數據庫中最簡單並且寫法統一的了)select
而針對SqlServer中的分頁有多種:分頁
經常使用的是用到了row_number()函數,可是隻支持SqlServer2005及以上版本語法
select top pagenum * from (select row_number()over(order by id)rownumber,* from a)a1 where rownumber>startpage
select * from (select row_number()over(order by id)rownumber,* from a) a1 where rownumber>startpage and rownumber<endpage+1
select * from (select row_number()over(order by id)rownumber,* from a) a1 where rownumber between startpage+1 and endpage
還有這種:
select top pagenum * from a where not exists (select 1 from (select top 30 id from a order by id)a1 where a1.id=a.id) order by id
可是我想說的是被好多人所不關注的一種分頁方法:
select * from 表 order by id OFFSET PageIndex*pagenum ROWS FETCH next pagenum rows only
這種方法是否是很簡單,可是這個只有在SQL Server 2012及以上版本中才能使用,不管是從邏輯讀取數仍是響應時間、實際執行行數等關鍵參數看,SQL Server 2012提供的OFFSET/FETCH NEXT分頁方式都比Row_Number()方式有了較大的提高。
注意:使用該方法必須使用order by ,否則會有語法錯誤。