天天看點

sql 分頁查詢

方法1: 适用于 SQL Server 2000/2005

SELECT TOP 頁大小 *
 FROM table1
 WHERE id NOT IN
           (
           SELECT TOP 頁大小*(頁數-1) id FROM table1 ORDER BY id
           )
 ORDER BY id      

方法2:

适用于 SQL Server 2000/2005

--順序寫法:
 SELECT TOP 頁大小 *
 FROM table1
 WHERE id >=
 (
 SELECT ISNULL(MAX(id),0)    //MAX(id)為空時,替換為0
 FROM 
 (
 SELECT TOP 頁大小*(頁數-1)+1 id FROM table1 ORDER BY id
 ) A
 )
 ORDER BY id
 
 --降序寫法:
 SELECT TOP 頁大小 *
 FROM table1
 WHERE id <=
 (
 SELECT ISNULL(MIN(id),0) 
 FROM 
 (
 SELECT TOP 頁大小*(頁數-1)+1 id FROM table1 ORDER BY id Desc
 ) A
 )
 ORDER BY id Desc      

方法3:

适用于 SQL Server 2005

SELECT TOP 頁大小 * 
 FROM 
        (
        SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,* FROM table1
         ) A
 WHERE RowNumber > 頁大小*(頁數-1)      

說明,頁大小:每頁的行數;頁數:第幾頁。使用時,請把“頁大小”和“頁大小*(頁數-1)”替換成數字。

其它的方案:如果沒有主鍵,可以用臨時表,也可以用方案三做,但是效率會低。

建議優化的時候,加上主鍵和索引,查詢效率會提高。

通過SQL 查詢分析器,顯示比較:我的結論是:

分頁方案二:(利用ID大于多少和SELECT TOP分頁)效率最高,需要拼接SQL語句

分頁方案一:(利用Not In和SELECT TOP分頁)   效率次之,需要拼接SQL語句

分頁方案三:(利用SQL的遊标存儲過程分頁)    效率最差,但是最為通用

網上抄的

ISNULL

使用指定的替換值替換NULL。

文法

ISNULL ( check_expression , replacement_value ) 

參數

check_expression

将被檢查是否為NULL的表達式。check_expression 可以是任何類型的。

replacement_value

在check_expression 為NULL時将傳回的表達式。replacement_value 必須與check_expresssion 具有相同的類型。

傳回類型

傳回與check_expression 相同的類型。

注釋

如果check_expression 不為NULL,那麼傳回該表達式的值;否則傳回replacement_value。

SELECT SUBSTRING(title, 1, 15) AS Title, type AS Type, 
   ISNULL(price, 0.00) AS Price   //價格為空時顯示為0.00
FROM titles      

使用with 可以使分頁子產品化起來,先正常查詢,再分頁(已固定)

declare @PageSize int =2;
declare @PageIndex int =1;
 with td as (select * from lmsField)
 select top (cast( @PageSize as int)) * from( select row_number()over(order by UpdateTime desc) as RowNumber,* from td) tab where RowNumber>((cast (@PageSize as int))*((cast(@PageIndex as int))-1))      

添加一行totalCount所有資料行

declare @PageSize int =2;
declare @PageIndex int =1;
 with td as (select * from lmsField)
 select top (cast( @PageSize as int)) *,TotalCount=(select count(1) from td) from( select row_number()over(order by UpdateTime desc) as RowNumber,* from td) tab where RowNumber>((cast (@PageSize as int))*((cast(@PageIndex as int))-1))      

sql2012新增分頁的方法 offset fetch

跟EF裡面的Take,Skip意思差不多,就是跳過指定行數,再傳回指定的行數

select count(1) over() as TotalCount,* from T_OrderInfo order by CreateTime desc offset 5 rows fetch next 3 rows only;
  select count(1) over() as TotalCount,* from T_OrderInfo order by CreateTime desc offset 0 row fetch first 3 rows only;