四種方式實(shí)現(xiàn)SQLServer

創(chuàng)新互聯(lián)公司長(zhǎng)期為上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為岢嵐企業(yè)提供專業(yè)的成都網(wǎng)站制作、網(wǎng)站建設(shè),岢嵐網(wǎng)站改版等技術(shù)服務(wù)。擁有十多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
分頁查詢
SQLServer
的數(shù)據(jù)分頁:
假設(shè)現(xiàn)在有這樣的一張表:
CREATE
TABLE
test
(
id
int
primary
key
not
null
identity,
names
varchar(20)
)
然后向里面插入大約1000條數(shù)據(jù),進(jìn)行分頁測(cè)試
假設(shè)頁數(shù)是10,現(xiàn)在要拿出第5頁的內(nèi)容,查詢語句如下:
--10代表分頁的大小
select
top
10
*
from
test
where
id
not
in
(
--40是這么計(jì)算出來的:10*(5-1)
select
top
40
id
from
test
order
by
id
)
order
by
id
原理:需要拿出數(shù)據(jù)庫的第5頁,就是40-50條記錄。首先拿出數(shù)據(jù)庫中的前40條記錄的id值,然后再拿出剩余部分的前10條元素
第二種方法:
還是以上面的結(jié)果為例,采用另外的一種方法
--數(shù)據(jù)的意思和上面提及的一樣
select
top
10
*
from
test
where
id
(
select
isnull(max(id),0)
from
(
select
top
40
id
from
test
order
by
id
)
A
)
order
by
id
原理:先查詢前40條記錄,然后獲得其最id值,如果id值為null的,那么就返回0
然后查詢id值大于前40條記錄的最大id值的記錄。
這個(gè)查詢有一個(gè)條件,就是id必須是int類型的。
第三種方法:
select
top
10
*
from
(
select
row_number()
over(order
by
id)
as
rownumber,*
from
test
)
A
where
rownumber
40
原理:先把表中的所有數(shù)據(jù)都按照一個(gè)rowNumber進(jìn)行排序,然后查詢r(jià)ownuber大于40的前十條記錄
這種方法和oracle中的一種分頁方式類似,不過只支持2005版本以上的
第四種:
存儲(chǔ)過程查詢
創(chuàng)建存儲(chǔ)過程
alter
procedure
pageDemo
@pageSize
int,
@page
int
AS
declare
@temp
int
set
@temp=@pageSize*(@page
-
1)
begin
select
top
(select
@pageSize)
*
from
test
where
id
not
in
(select
top
(select
@temp)
id
from
test)
order
by
id
end
執(zhí)行存儲(chǔ)過程
exec
10,5
SQL Server 在2012版本中 提供了一種新的分頁方式 fetch next
相比以前開窗函數(shù)來看有什么區(qū)別呢? 我用 sql server 系統(tǒng)表產(chǎn)生笛卡爾積 做了一個(gè)測(cè)試
先來看一下數(shù)據(jù)量
在翻頁數(shù)量不大的時(shí)候的比較 第20頁的時(shí)候的比較
1、開窗函數(shù)
2、fetch next
可以看出所花費(fèi)的時(shí)間相當(dāng)接近的,兩者都是1.2s
我們把頁數(shù)增大,再來看看區(qū)別 第200000頁的時(shí)候比較
一個(gè)花了3.9s,一個(gè)花了1.6s
當(dāng)隨著頁數(shù)的增加 可以看出 fetch next 分頁的性能是優(yōu)于開窗函數(shù)的。
所以當(dāng)你是使用sql server2012及以上版本的時(shí)候,建議還是采用 fetch next 來進(jìn)行分頁吧。
假設(shè)現(xiàn)在有這樣的一張表:
CREATE TABLE test
(
id int primary key not null identity,
names varchar(20)
)
然后向里面插入大約1000條數(shù)據(jù),進(jìn)行分頁測(cè)試
假設(shè)頁數(shù)是10,現(xiàn)在要拿出第5頁的內(nèi)容,查詢語句如下:
--10代表分頁的大小
select top 10 *
from test
where id not in
四種方式實(shí)現(xiàn)SQLServer 分頁查詢
SQLServer 的數(shù)據(jù)分頁:
假設(shè)現(xiàn)在有這樣的一張表:
CREATE TABLE test
(
id int primary key not null identity,
names varchar(20)
)
然后向里面插入大約1000條數(shù)據(jù),進(jìn)行分頁測(cè)試
假設(shè)頁數(shù)是10,現(xiàn)在要拿出第5頁的內(nèi)容,查詢語句如下:
--10代表分頁的大小
select top 10 *
from test
where id not in
(
--40是這么計(jì)算出來的:10*(5-1)
select top 40 id from test order by id
)
order by id
原理:需要拿出數(shù)據(jù)庫的第5頁,就是40-50條記錄。首先拿出數(shù)據(jù)庫中的前40條記錄的id值,然后再拿出剩余部分的前10條元素
第二種方法:
還是以上面的結(jié)果為例,采用另外的一種方法
--數(shù)據(jù)的意思和上面提及的一樣
select top 10 *
from test
where id
(
select isnull(max(id),0)
from
(
select top 40 id from test order by id
) A
)
order by id
原理:先查詢前40條記錄,然后獲得其最id值,如果id值為null的,那么就返回0
然后查詢id值大于前40條記錄的最大id值的記錄。
這個(gè)查詢有一個(gè)條件,就是id必須是int類型的。
第三種方法:
select top 10 *
from
(
select row_number() over(order by id) as rownumber,* from test
) A
where rownumber 40
原理:先把表中的所有數(shù)據(jù)都按照一個(gè)rowNumber進(jìn)行排序,然后查詢r(jià)ownuber大于40的前十條記錄
這種方法和oracle中的一種分頁方式類似,不過只支持2005版本以上的
第四種:
存儲(chǔ)過程查詢
創(chuàng)建存儲(chǔ)過程
alter procedure pageDemo
@pageSize int,
@page int
AS
declare @temp int
set @temp=@pageSize*(@page - 1)
begin
select top (select @pageSize) * from test where id not in (select top (select @temp) id from test) order by id
end
執(zhí)行存儲(chǔ)過程
exec 10,5
名稱欄目:sqlserver中分頁,sql分頁的幾種方式
轉(zhuǎn)載注明:http://chinadenli.net/article35/dseecpi.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、自適應(yīng)網(wǎng)站、微信公眾號(hào)、定制網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)頁設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)