SQL server分頁詳解

2021-10-02 13:12:19 字數 3461 閱讀 8650

1. row_number() over()和between

2. offset fetch next

3. 基於儲存過程

準備測試資料

if

exists

(select

'x'from sys.

tables

where name=

'userinfo'

)drop

table userinfo

gocreate

table userinfo(

id int

primary

keyidentity

(1001,1

),username varchar(20

)not

null)go

insert

into userinfo values

('劉一'),

('陳二'),

('張三'),

('李四'),

('王五'),

('趙六'),

('孫七'),

('周八'),

('吳九'),

('鄭十'

);

--between:選取介於兩個值之間的資料範圍

/*row_number():返回結果集分割槽內行的序列號,每個分割槽的第一行從1開始

配合 over()使用 over(order by id):指定排序方式

注:如直接使用id,不能排除id跳號的情況*/

select id,username

from

(select

*,row_number(

)over

(order

by id) row_id from userinfo) t

where t.row_id between(5

*(1-

1)+1

)and5*

1

/*ceiling():向上取整,如除數是整數,要*1.0轉成小數才效果最佳.

注意:取整時需注意正負數小數字四捨五入問題*/

select id,username,ceiling(

1.0*t.pagecounts/5)

as 總頁數

此方法需要在sql server 2012及更高版本支援,如果自己的版本支援那麼推薦使用此方法,相對於row_number() over()和between的效能有較大提公升。使用注意事項:order by 是使用 offset 和 fetch 子句所必需的

offset :用於指定跳過(skip)的資料行

fetch:該子句在offset子句之後執行,表示在跳過(sikp)指定數量的資料行之後,返回一定資料量的資料行

執行順序:offset子句必須在order by 子句之後執行,fetch子句必須在offset子句之後執行

top 不能在同乙個查詢表示式中與 offset 和 fetch 一起使用

select

*from userinfo order

by id offset(5

*(1-

1))rows

fetch

next

5rows only

思路:使用offset 跳過開始行數,然後使用fetch next返回結束行數的剩餘數

公式:offset 開始行數 rows fetch next 結束行數 rows only

結果:跳過第0行從第1行開始,返回從第1行開始往下數的五行資料,假如是第二頁(5*(2-1)),就是跳過第五行開始,返回從第6行開始往下數的五行資料

注意事項與第二種基本同步

if

exists

(select

'x'from sys.objects where name=

'sp_page'

)drop

proc sp_page

gocreate

procedure sp_page

@tablename

varchar(20

),--表名

@pagesize

int,

--每頁條數

@page

int--頁數

asdeclare

@newspage

int,

@res

varchar

(100

)begin

set@newspage

=@pagesize*(

@page-1

)set

@res

='select * from '

+@tablename

+' order by id offset '

+cast(

@newspage

asvarchar(10

))+' rows fetch next '

+ cast(

@pagesize

asvarchar(10

))+' rows only'

exec

(@res

)end

go--呼叫儲存過程

注:我們總是喜歡拿順其自然來敷衍人生道路上的荊棘坎坷,卻很少承認真正的順其自然,其實是竭盡所能之後的不強求而非兩手一攤的不作為

希望對你有所幫助

SQL Server 分頁查詢

ps,此文是純個人筆記 公司裡乙個專案裡用到了一種資料庫分頁查詢的方式 1 定義乙個臨時的table 這個table有乙個自增的之間id,和要查的資料表的主鍵id 2 再一次查詢,用id在分頁數段來and 一下結果 具體操作如下 定義個臨時表 temptable declare temptable ...

Sql Server分頁語句

分頁方案一 利用not in和select top分頁 語句形式 select top 10 from testtable where id not in select top 20 id from testtable order by id order by id select top 頁大小 f...

sql server實現分頁

sqlserver 的資料分頁 假設現在有這樣的一張表 create table test id int primary key not null identity,names varchar 20 然後向裡面插入大約1000條資料,進行分頁測試 假設頁數是10,現在要拿出第5頁的內容,查詢語句如下...