成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何在SQL Server查詢中實現高效分頁

數據庫 SQL Server
經常寫SQL查詢腳本的朋友,很可能會遭遇分頁查詢的問題。在MSSQL2000及以前的版本中,分頁的寫法大多采用純Top嵌套方式,寫法比較復雜、而且效率并不理想。今天我們就談談ROW_NUMBER和offset的語法和在分頁中的應用。

 經常寫SQL查詢腳本的朋友,很可能會遭遇分頁查詢的問題。在MSSQL2000及以前的版本中,分頁的寫法大多采用純Top嵌套方式,寫法比較復雜、而且效率并不理想。

從MSSQL2005開始,SQL Server提供了一個內置函數ROW_NUMBER,這是一個非常神奇的函數。

從MSSQL2012開始,SQL Server提供了offset方法進行分頁。使用offset startPage rows fetch next pageSize rows only 方式進行分頁。

今天我們就談談ROW_NUMBER和offset的語法和在分頁中的應用。

[[253435]]
ROW_NUMBER的含義及語法定義

ROW_NUMBER實現對結果集的輸出進行編號。 具體來說,返回結果集分區內行的序列號,每個分區的***行從 1 開始。

ROW_NUMBER ( ) OVER ( [ PARTITION BY 字段 , ] order_by_clause )PARTITION BY:將 FROM 子句生成的結果集劃分為應用 ROW_NUMBER 函數的分區。 value_expression 指定對結果集進行分區所依據的列。 如果未指定 PARTITION BY,則此函數將查詢結果集的所有行視為單個組。order_by_clause: 子句可確定在特定分區中為行分配*** ROW_NUMBER 的順序。 order by 子句是必選項。返回值:bigint。結果集分區內行的序列號。offset的含義及語法定義

offset是order by的子句,主要用來限定返回的行數,用來做分頁也是很合適的。只是從MSSQL2012才開始支持。語法結構如下:

  1. FETCH { NEXT } { integer_constant | fetch_row_count_expression } { ROWS } ONLY 

fetch_row_count_expression 可以是變量、參數或常量標量子查詢。 在使用子查詢時,它無法引用在外部查詢范圍中定義的任何列。也就是說,它無法與外部查詢相關聯。

結合到分頁,語法語法: 

  1. offset startPage rows fetch next pageSize rows only 

其中起始頁面:startPage=(@page-1)*@rows,頁面大小:pageSize=@rows

演示數據準備

為了說明方便,我們準備一些演示數據,這是一個簡單的業務銷售表,字段只有業務員、銷售區域和銷售額,如下:

  1. declare @sale table( FName nvarchar(50), FDistrict nvarchar(50), FAmount decimal(28,10) ); 
  2. insert into @sale values ('張三','北京',20000), ('張三','上海',50000), ('張三','深圳',40000), ('張三','廣州',30000), ('李四','北京',30000), ('李四','上海',50000), ('李四','深圳',40000), ('李四','廣州',10000), ('王二','北京',70000), ('王二','上海',10000), ('王二','深圳',60000), ('王二','廣州',20000), ('馬六','北京',80000), ('馬六','上海',20000), ('馬六','深圳',70000), ('馬六','廣州',60000) 

準備演示數據

使用ROW_NUMBER分頁

比如我們希望按照業務員+銷售區域排序后,每4條記錄一頁顯示,寫法如下: 

  1. declare @pagesize int =4;--每頁記錄數  
  2. declare @pagenum int =1;--第幾頁  
  3. select v.* from (select row_number() over(order by FName,FDistrict) as FRowIndex,* from @sale) as v where v.FRowIndex between @pagesize*(@pagenum-1)+1 and @pagenum*@pagesize; 

分頁查詢

ROW_NUMBER函數在SQL中屬于熱名稱(即剛定的名稱FRowIndex),只可以出現在select子句中,需要放在子查詢中。也可以先對子查詢做好定義后面再直接引用,語法如下: 

  1. declare @pagesize int =4;--每頁記錄數  
  2. declare @pagenum int =1;--第幾頁  
  3. with saledata as ( select row_number() over(order by FName,FDistrict) as FRowIndex,* from @sale )  
  4. select * from saledata where FRowIndex between @pagesize*(@pagenum-1)+1 and @pagenum*@pagesize; 

分頁查詢

ROW_NUMBER來做分頁查詢,經過反復應用測試,效率還是很高的。完整的測試腳本參看下圖:

使用OFFSET實現分頁

重復的代碼部分不再贅述,在查詢時要注意,offset是Order By的子句,不能獨立存在。語法結構如下: 

  1. select * from @sale order by FName,FDistrict offset (@pagenum-1)*@pagesize rows fetch next @pagesize rows only 

返回的結果與使用row_number是一致的。完整的測試腳本參看下圖:

希望對您有所幫助! 

責任編輯:龐桂玉 來源: 快資訊
相關推薦

2011-08-19 09:30:42

分頁查詢SQL ServerMySQL

2024-03-05 15:28:38

SQL窗口函數分頁查詢

2010-09-13 13:19:16

Sql Server分

2010-05-07 09:58:27

SQL Server

2010-06-18 10:34:38

SQL Server

2010-11-10 15:23:55

SQL SERVER

2010-09-26 15:29:13

sql查詢分頁

2010-11-10 15:29:40

SQL SERVER

2010-10-21 11:44:55

SQL Server分

2020-04-17 11:45:22

LibreOffice桌面應用

2010-11-09 13:09:58

SQL Server分

2009-07-15 15:18:01

JDBC連接SQL S

2010-09-07 10:35:38

SQL語句

2020-11-19 15:26:36

SQLPandas代碼

2012-07-23 14:30:33

Oracle

2010-10-21 10:28:13

SQL Server查

2011-06-27 14:50:41

SQL Server

2011-03-11 13:26:23

SQL Server數導入數據

2010-10-11 09:05:40

SQL Server

2020-08-17 14:56:02

PythonSQL
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 黑人巨大精品欧美一区二区免费 | h视频在线播放 | 五月激情六月婷婷 | 久久国产精品色av免费观看 | 99精品欧美一区二区蜜桃免费 | 97精品超碰一区二区三区 | 免费在线观看h片 | 国产一级一片免费播放 | 国产精品一区二区av | 欧美日韩久久 | 一区二区三区在线播放 | 成人国产一区二区三区精品麻豆 | av片免费观看 | 日本精品一区二区三区在线观看 | 中文字幕在线观看精品 | 97国产精品视频 | 成人av高清 | 五月婷婷婷 | 免费成人在线网站 | 国产精品一区一区三区 | 成人av一区 | 在线观看久草 | 一级片在线视频 | 你懂的av | 一区二区手机在线 | 欧美成人a∨高清免费观看 色999日韩 | 国产激情一区二区三区 | 91porn国产成人福利 | 亚洲欧美精品在线 | 国产视频久 | 国产91丝袜在线播放 | 久久久综合精品 | 99re在线免费视频 | a免费在线 | 综合久久99 | 欧美综合一区二区三区 | 91久久久久久久久久久 | 免费看的黄网站 | 黄色大片在线播放 | 少妇久久久 | 国产区视频在线观看 |