偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

如何在SQL Server查詢(xún)中實(shí)現(xiàn)高效分頁(yè)

數(shù)據(jù)庫(kù) SQL Server
經(jīng)常寫(xiě)SQL查詢(xún)腳本的朋友,很可能會(huì)遭遇分頁(yè)查詢(xún)的問(wèn)題。在MSSQL2000及以前的版本中,分頁(yè)的寫(xiě)法大多采用純Top嵌套方式,寫(xiě)法比較復(fù)雜、而且效率并不理想。今天我們就談?wù)凴OW_NUMBER和offset的語(yǔ)法和在分頁(yè)中的應(yīng)用。

 經(jīng)常寫(xiě)SQL查詢(xún)腳本的朋友,很可能會(huì)遭遇分頁(yè)查詢(xún)的問(wèn)題。在MSSQL2000及以前的版本中,分頁(yè)的寫(xiě)法大多采用純Top嵌套方式,寫(xiě)法比較復(fù)雜、而且效率并不理想。

從MSSQL2005開(kāi)始,SQL Server提供了一個(gè)內(nèi)置函數(shù)ROW_NUMBER,這是一個(gè)非常神奇的函數(shù)。

從MSSQL2012開(kāi)始,SQL Server提供了offset方法進(jìn)行分頁(yè)。使用offset startPage rows fetch next pageSize rows only 方式進(jìn)行分頁(yè)。

今天我們就談?wù)凴OW_NUMBER和offset的語(yǔ)法和在分頁(yè)中的應(yīng)用。

[[253435]]
ROW_NUMBER的含義及語(yǔ)法定義

ROW_NUMBER實(shí)現(xiàn)對(duì)結(jié)果集的輸出進(jìn)行編號(hào)。 具體來(lái)說(shuō),返回結(jié)果集分區(qū)內(nèi)行的序列號(hào),每個(gè)分區(qū)的***行從 1 開(kāi)始。

ROW_NUMBER ( ) OVER ( [ PARTITION BY 字段 , ] order_by_clause )PARTITION BY:將 FROM 子句生成的結(jié)果集劃分為應(yīng)用 ROW_NUMBER 函數(shù)的分區(qū)。 value_expression 指定對(duì)結(jié)果集進(jìn)行分區(qū)所依據(jù)的列。 如果未指定 PARTITION BY,則此函數(shù)將查詢(xún)結(jié)果集的所有行視為單個(gè)組。order_by_clause: 子句可確定在特定分區(qū)中為行分配*** ROW_NUMBER 的順序。 order by 子句是必選項(xiàng)。返回值:bigint。結(jié)果集分區(qū)內(nèi)行的序列號(hào)。offset的含義及語(yǔ)法定義

offset是order by的子句,主要用來(lái)限定返回的行數(shù),用來(lái)做分頁(yè)也是很合適的。只是從MSSQL2012才開(kāi)始支持。語(yǔ)法結(jié)構(gòu)如下:

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

fetch_row_count_expression 可以是變量、參數(shù)或常量標(biāo)量子查詢(xún)。 在使用子查詢(xún)時(shí),它無(wú)法引用在外部查詢(xún)范圍中定義的任何列。也就是說(shuō),它無(wú)法與外部查詢(xún)相關(guān)聯(lián)。

結(jié)合到分頁(yè),語(yǔ)法語(yǔ)法: 

  1. offset startPage rows fetch next pageSize rows only 

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

演示數(shù)據(jù)準(zhǔn)備

為了說(shuō)明方便,我們準(zhǔn)備一些演示數(shù)據(jù),這是一個(gè)簡(jiǎn)單的業(yè)務(wù)銷(xiāo)售表,字段只有業(yè)務(wù)員、銷(xiāo)售區(qū)域和銷(xiāo)售額,如下:

  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) 

準(zhǔn)備演示數(shù)據(jù)

使用ROW_NUMBER分頁(yè)

比如我們希望按照業(yè)務(wù)員+銷(xiāo)售區(qū)域排序后,每4條記錄一頁(yè)顯示,寫(xiě)法如下: 

  1. declare @pagesize int =4;--每頁(yè)記錄數(shù)  
  2. declare @pagenum int =1;--第幾頁(yè)  
  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; 

分頁(yè)查詢(xún)

ROW_NUMBER函數(shù)在SQL中屬于熱名稱(chēng)(即剛定的名稱(chēng)FRowIndex),只可以出現(xiàn)在select子句中,需要放在子查詢(xún)中。也可以先對(duì)子查詢(xún)做好定義后面再直接引用,語(yǔ)法如下: 

  1. declare @pagesize int =4;--每頁(yè)記錄數(shù)  
  2. declare @pagenum int =1;--第幾頁(yè)  
  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; 

分頁(yè)查詢(xún)

ROW_NUMBER來(lái)做分頁(yè)查詢(xún),經(jīng)過(guò)反復(fù)應(yīng)用測(cè)試,效率還是很高的。完整的測(cè)試腳本參看下圖:

使用OFFSET實(shí)現(xiàn)分頁(yè)

重復(fù)的代碼部分不再贅述,在查詢(xún)時(shí)要注意,offset是Order By的子句,不能獨(dú)立存在。語(yǔ)法結(jié)構(gòu)如下: 

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

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

希望對(duì)您有所幫助! 

責(zé)任編輯:龐桂玉 來(lái)源: 快資訊
相關(guān)推薦

2011-08-19 09:30:42

分頁(yè)查詢(xún)SQL ServerMySQL

2024-03-05 15:28:38

SQL窗口函數(shù)分頁(yè)查詢(xún)

2010-05-07 09:58:27

SQL Server

2010-06-18 10:34:38

SQL Server

2010-09-13 13:19:16

Sql Server分

2010-09-26 15:29:13

sql查詢(xún)分頁(yè)

2010-11-10 15:23:55

SQL SERVER

2010-11-10 15:29:40

SQL SERVER

2009-07-15 15:18:01

JDBC連接SQL S

2010-10-21 11:44:55

SQL Server分

2020-11-19 15:26:36

SQLPandas代碼

2020-04-17 11:45:22

LibreOffice桌面應(yīng)用

2010-09-07 10:35:38

SQL語(yǔ)句

2010-11-09 13:09:58

SQL Server分

2012-07-23 14:30:33

Oracle

2011-06-27 14:50:41

SQL Server

2011-03-11 13:26:23

SQL Server數(shù)導(dǎo)入數(shù)據(jù)

2010-10-21 10:28:13

SQL Server查

2020-08-17 14:56:02

PythonSQL

2010-10-11 09:05:40

SQL Server
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)