日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

SQLServer常用分页方式

發(fā)布時(shí)間:2024/6/21 综合教程 26 生活家
生活随笔 收集整理的這篇文章主要介紹了 SQLServer常用分页方式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  mysql的分頁是基于limit關(guān)鍵字,oracle的分頁是基于rownum行號(hào),SQLserver的分頁在下面進(jìn)行研究,是基于SQLServer2012進(jìn)行的測(cè)試。

0.原來的SQL的所有數(shù)據(jù)

下面的測(cè)試假設(shè)每頁都是取5條數(shù)據(jù)。

1.第一種-ROW_NUMBER() OVER()方式(over函數(shù)必須有)

(1)取第一頁數(shù)據(jù)

  select * from ( 
    select *, ROW_NUMBER() OVER(Order by ID ) AS RowId from [mydb].[dbo].[user] 
  ) as b

      where RowId between 1 and 5;

結(jié)果:

(2)取第二頁數(shù)據(jù)

  select * from ( 
    select *, ROW_NUMBER() OVER(Order by ID ) AS RowId from [mydb].[dbo].[user] 
  ) as b

      where RowId between 6 and 10;

結(jié)果:

總結(jié):  這種方式采用 RowId BETWEEN 當(dāng)前頁數(shù)-1*頁大小+1 and 頁數(shù)*頁大小 ,而且包含起始值與結(jié)束值。

補(bǔ)充:這種方式的通用寫法如下: 原來SQL不能帶order by ,但是可以帶條件。

原來SQL = select * from [mydb].[dbo].[user] where name like 'name%'

拼接分頁的模板如下:

 select * from ( 
    select *, ROW_NUMBER() OVER(Order by ID ) AS RowId from    (
            原來SQL
        ) AS A
) as B
where RowId between 1 and 5;

2.第二種-offset start fetch next page rows only

(1)取第一頁

select * from [mydb].[dbo].[user]   order by ID offset 0 rows fetch next 5 rows only;

結(jié)果:

(2)取第二頁

select * from [mydb].[dbo].[user]   order by ID offset 5 rows fetch next 5 rows only;

結(jié)果:

總結(jié):這種方式的起始值與結(jié)束值計(jì)算方式: offset 頁號(hào)*頁大小 rows fetch next 頁大小 rows only  

3.第三種: top 關(guān)鍵字

(1)取第一頁

select top 5 * from [mydb].[dbo].[user] 
where ID not in (select top 0 ID from [mydb].[dbo].[user]);

結(jié)果:

(2)取第二頁

select top 5 * from [mydb].[dbo].[user] 
where ID not in (select top 5 ID from [mydb].[dbo].[user]);

結(jié)果:

 總結(jié):這種方式只用改內(nèi)層的 top就可以了: 內(nèi)層的top后面相當(dāng)于起始值,計(jì)算方式為 (頁號(hào)-1)*頁大小。

補(bǔ)充:這種分頁方式的通用模板如下: 這個(gè)可以加order by和條件

原來SQL =select * from [mydb].[dbo].[user] where name like 'name%'

select top 5 * from ( 
    原來SQL
) AS A where ID not in (select top 5 ID from [mydb].[dbo].[user]);

4.ROW_NUMBER() + top 相當(dāng)于上面1和3的結(jié)合使用

(1)取第一頁

select top (5) * from (select *, ROW_NUMBER() OVER(Order by ID ) AS RowId from [mydb].[dbo].[user]) as A where A.RowId>0;

結(jié)果:

(2)取第二頁

select top (5) * from (select *, ROW_NUMBER() OVER(Order by ID ) AS RowId from [mydb].[dbo].[user]) as A where A.RowId>5;

結(jié)果:

  總結(jié):這種方式比較通用, 第一個(gè) top 里面的值 相當(dāng)于 頁大小,第二個(gè)rowID>起始值,起始值計(jì)算方式為 (頁號(hào)-1)*頁大小

補(bǔ)充:這種分頁方式的通用模板如下: 這種方式原來的SQL也不用加排序語句

原來SQL =select * from [mydb].[dbo].[user] where name like 'name%'

select top (5) * from (
    select *, ROW_NUMBER() OVER(Order by ID ) AS RowId from (
        原來SQL
        ) as A   
) as B where B.RowId>5;

注意:文中SQLServer的AS A這些起別名不能省略。

總結(jié)

以上是生活随笔為你收集整理的SQLServer常用分页方式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。