SQL Server SQL分頁查詢

2021-09-08 04:19:00 字數 2581 閱讀 6252

sql server sql分頁查詢的幾種方式目錄

0.序言

1.top…not in…

2.row_number()

3.offset…fetch

4.執行計畫

5.補充

0.序言

總結一下sql server種常用的幾種分頁查詢:

本示例中用的時已有的表,建表不規範,name作為主鍵,建議實際使用中專門設定主鍵並且where條件中盡可能使用主鍵。

引數說明:

@pagesize:分頁查詢每頁n條資料時每頁期望的資料量n

@offset:分頁查詢第i頁每頁n條資料時,第i頁之前的n*(i-1)條資料

舉個栗子:假如我們要查詢第3頁的資料,每頁10條資料,則 @pagesize為10,@offset為20。

1.top…not in…

基本原理:查詢 @pagesize 條資料,先使用乙個子查詢查詢出符合查詢條件的 @offset條資料的主鍵,再使用top @pagesize查詢@pagesize條資料,並且再where從句中使用not in

基本原理:在sql server2005之後加入,可以使用 row_number()函式為查詢出來的記錄生成乙個行號,需要指定乙個order by 子句確定排序方式,排序方式不同,行號也可能不同。詳細說明:row_number()

本文只涉及over從句中跟隨order by子句,partition by 從句不在本文討論範圍內,partition by 和over詳細說明戳這裡

這裡使用了兩個row_number()函式的例子,這兩個計算總行數的方式是不一樣的,本文結尾處會對比乙個兩種方式的io操作以說明哪種方式更適合

3.offset…fetch

offset是sql server 2012中新增的語法,可以單獨使用,也可與fetch next一起使用,單獨使用offset時是查詢獲取@offset之後所有的資料,如下圖所示

但我們想要的是分頁查詢,那就需要和fetch next聯合使用,offset後跟@offset引數,fetch next 後跟 @pagesize引數

4.執行計畫

上面四種查詢方式的執行計畫如下:

5.補充

offset…fetch補充:

關於引數,推薦用法:始終使用rows,始終使用next

-- offset rows fetch next rows only

/**使用 offset-fetch 中的限制:

*** order by 是使用 offset 和 fetch 子句所必需的。

*** offset 子句必須與 fetch 一起使用。永遠不能使用 order by … fetch。

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

*** offset/fetch 行計數表示式可以是將返回整數值的任何算術、常量或引數表示式。該行計數表示式不支援標量子查詢。

*/

更多offset資訊參考這裡

對比一下row_number()兩種計算資料總數方式的io消耗:

第乙個是使用max(rownum)來計算總數的,第二種是使用子查詢的方式來計算總數。

示例sql:pagedquery

SQL SERVER SQL傳送郵件

xhtml view plain copy print?sql server 並沒有內建郵件伺服器 mail server 它跟我們傳送郵件一樣,需要使用者名稱和密碼通過 smtp message transfer protocol 去連線郵件伺服器。我們想讓 sql server 來傳送郵件,首先...

linq高階查與分頁

前台 page language c autoeventwireup true codefile linq資料顯示.aspx.cs inherits linq資料顯示 css body xuanze table head mian td 後台 using system using system.co...

SQL Server SQL語句匯入匯出大全

匯出到excel exec master.xp cmdshell bcp settledb.dbo.shanghu out c temp1.xls c q s gnetdata gnetdata u sa p 匯入excel select from opendatasource microsoft....