sql中的分页实现,SQL分页查询的二种方法

一.二种艺术

SQL Server 对行数的排序提供了 TOP 筛选。SQL Server 2011 新扩大了 OFFSET
筛选。

需求:查询表dbo.Message,每页10条,查询第2页

需求:查询表dbo.Message,每页10条,查询第2页

  1.1:row_number() over()函数

 

1:TOP()

1:TOP()

  1.2:OFFSET ….FETCH 

一、TOP 筛选

SELECT TOP(20) * FROM  dbo.Message WHERE Code NOT IN
(SELECT TOP(10) Code FROM dbo.Message)
SELECT TOP(20) * FROM  dbo.Message WHERE Code NOT IN
(SELECT TOP(10) Code FROM dbo.Message)

        OFFSET { integer_constant | offset_row_count_expression } {
ROW | ROWS }

  借使有 OLacrosseDERAV4 BY 子句,TOP
筛选将依靠排序的结果回到内定的行数。假诺未有 ORDE奥迪Q3 BY 子句,TOP
筛选将依据行的情理顺序重临钦赐的行数。

2:BETWEEN *  AND *  ,  Row_Number() OVER(ORDER BY *) AS rowNum 

2:BETWEEN *  AND *  ,  Row_Number() OVER(ORDER BY *) AS rowNum 

        内定在从询问表明式中初露重返行在此以前,将跳过的行数。OFFSET
子句的参数可以是过量或等于零的平头或表明式。ROW 和 ROWS 能够交流使用。

 

SELECT *,ROW_NUMBER() OVER(ORDER BY Code) AS rowNum INTO #a FROM  dbo.Message 
SELECT * FROM #a WHERE rowNum BETWEEN 11 AND 20
DROP TABLE #a;
SELECT *,ROW_NUMBER() OVER(ORDER BY Code) AS rowNum INTO #a FROM  dbo.Message 
SELECT * FROM #a WHERE rowNum BETWEEN 11 AND 20
DROP TABLE #a;

        FETCH { FILANDST|NEXT } <行计数表明式> { ROW|ROWS } ONLY

1. 赶回钦点数量的行

或者: 

或者: 

      内定在处理 OFFSET 子句后,将赶回的行数。FETCH
子句的参数能够是超越或等于 一 的平头或表明式。ROW 和 ROWS
能够交流使用。同样,FI奥迪Q5ST 和 NEXT 能够调换使用。

  TOP 用于提醒从询问结果集重返钦命数量的行。

SELECT * FROM (
                SELECT  *, ROW_NUMBER() OVER (ORDER BY CreateTime DESC) AS 'RowNumberForSplit'
                FROM  office.Conference 
                WHERE  1=1) temp 
WHERE RowNumberForSplit BETWEEN 1 AND 10
SELECT * FROM (
                SELECT  *, ROW_NUMBER() OVER (ORDER BY CreateTime DESC) AS 'RowNumberForSplit'
                FROM  office.Conference 
                WHERE  1=1) temp 
WHERE RowNumberForSplit BETWEEN 1 AND 10

 

  例如,返回前2行记录:

 

 

每页10条,查询第八页的数额

    SELECT TOP (2) ColumnA, ColumnB  FROM Table1

3:WITH * AS ()   ,    Row_Number() OVER(ORDER BY *) AS rowNum 

3:WITH * AS ()   ,    Row_Number() OVER(ORDER BY *) AS rowNum 

select * from (select row_number() over(order by U_sortNo) as Rm,*
from A01 where u_areacode=’130000′) as t where 100<Rm and Rm<=110

 

WITH sss AS(
SELECT *,ROW_NUMBER() OVER(ORDER BY CreateTime) AS rowNum FROM DBO.Message
)
SELECT * FROM sss WHERE rowNum BETWEEN 11 AND 20
WITH sss AS(
SELECT *,ROW_NUMBER() OVER(ORDER BY CreateTime) AS rowNum FROM DBO.Message
)
SELECT * FROM sss WHERE rowNum BETWEEN 11 AND 20

SELECT A0100,COUNT(1) OVER() AS total
FROM A01
where u_areacode=’130000′
ORDER BY U_sortNo
OFFSET 100 ROWS FETCH NEXT 10 ROWS ONLY

sql中的分页实现,SQL分页查询的二种方法。贰. 回到钦点百分比的行

4: SQL Server 2012的OFFSET-FETCH筛选

4: SQL Server 2012的OFFSET-FETCH筛选

表明跳过100行不包蕴第80条数据,并查出来之后的十的数码,也正是十1-1第10中学的10条数据

  可以利用比例,若是遇上百分比的企图结果不是整数,将向上舍入(即“进一法”,而不是“四舍伍入”或“截尾取整”)。比方,重回前十分之一的行:

SELECT * FROM DBO.Message ORDER BY CreateTime OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY
SELECT * FROM DBO.Message ORDER BY CreateTime OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY

 

    SELECT TOP (10) PERCENT ColumnA, ColumnB FROM Table1

 

 

        /// 分页
        /// </summary>
        /// <param name="pageIndex">获取当前页码默认为1</param>
        /// <param name="pageSize">获取每页显示多少条记录</param>
        public string GetUserList(int pageIndex, int pageSize,string orderField, string orderType)
        {
            int count;
            string sql = @"select a.*,b.Title,b.Content from Power_user a
left join Knowledge b on a.ID = b.CreateUserID";
            string strsql = string.Format("select * from ({0}) T_TT  where 1=1 ", sql);
            StringBuilder stringBuilder = new StringBuilder();
            int num = (pageIndex-1) * pageSize;
            int num2 = pageIndex * pageSize;
            string str;
            if (!string.IsNullOrEmpty(orderField))
            {
                str = "Order By " + orderField + " " + orderType;
            }
            else
            {
                str = "order by (select 0)";
            }
            stringBuilder.Append("Select * From (Select ROW_NUMBER() Over (" + str + ")");
            stringBuilder.Append(string.Concat(new object[]
            {
                " As rowNum, * From (",
                strsql,
                ") As T ) As N Where rowNum > ",
                num,
                " And rowNum <= ",
                num2
            }));
            count = System.Convert.ToInt32(SqlHelper.ExecuteScalar(SqlHelper.ConnectionString, CommandType.Text, "Select Count(1) From (" + strsql + ") As t", null)); ;
            DataTable dt = SqlHelper.ExecuteDataTable(SqlHelper.ConnectionString, CommandType.Text, stringBuilder.ToString(), null);
            string Json = JsonConvert.SerializeObject(dt);
             List<Power_User> userModel = SqlHelper.ExecuteClass<Power_User>(SqlHelper.ConnectionString, strsql, null);
            //string b = JsonConvert.SerializeObject(userModel);
            return Json;
        }

 

那边第陆中方法做详细介绍:

此间第五中方法做详细介绍:

 

3.WITH TIES 参数

 

 

  在与OCR-VDE智跑 BY
子句组合使用时,有时候会冒出并列排行的意况,比如,再次来到前拾名非凡成绩的学习者,大概遇见多名学童并列第7名。此时急需钦点WITH
TIES,以保障并列第九名的学员都被含有到结果集中,此时的结果集只怕多于拾行。示例:

TOP分选是二个特出实用的筛选类型,但它有八个缺陷——不是正经SQL,且不扶助跳过功用。规范SQL定义的TOP类似筛选称为OFFSET-FETCH,帮衬跳过功效,那对针对一定页面包车型大巴询问非凡有效。SQL
Server二〇一二引进了对OFFSET-FETCH筛选的支撑。

TOP慎选是1个万分实用的筛选类型,但它有多少个毛病——不是标准SQL,且不帮助跳过效率。标准SQL定义的TOP类似筛选称为OFFSET-FETCH,扶助跳过功效,那对针对性一定页面包车型大巴查询分外管用。SQL
Server2011引进了对OFFSET-FETCH筛选的帮忙。

  SELECT TOP (10) WITH TIES ColumnA, ColumnB FROM Table1 ORDER
BY ColumnA DESC

SQL Server 2012中的OFFSET-FETCH筛选被视为ORDER
BY
子句的1部分,经常用于落到实处按梯次显示效果。OFFSET子句钦定要跳过的行数,FETCH子句钦点在跳过的行数后要筛选的行数。请思念一下底下的询问示例。

SQL Server 2012中的OFFSET-FETCH筛选被视为ORDER
BY
子句的1有个别,平常用于落到实处按梯次彰显效果。OFFSET子句钦点要跳过的行数,FETCH子句钦定在跳过的行数后要筛选的行数。请想想一下底下的询问示例。

 

SELECT orderid, orderdate, custid, empid

SELECT orderid, orderdate, custid, empid

二、OFFSET 筛选

FROM Sales.Orders

FROM Sales.Orders

  OFFSET 子句必须与 OKoleosDE中华V BY 子句组合使用,而且不得以与 TOP
同时使用。与 TOP 比较,OFFSET 即未有 PE奥迪Q3CENT 参数,也从未 WITH TIES
参数。

ORDER BY orderdate, orderid

ORDER BY orderdate, orderid

 

OFFSET 50 ROWS FETCH NEXT 25 ROWS ONLY;

OFFSET 50 ROWS FETCH NEXT 25 ROWS ONLY;

一. 跳过钦点的行数

此询问按orderdate997755.com澳门葡京,、orderid梯次(订单日期从最远到近日,并增多了决胜属性(tiebreaker)orderid)排序Orders表中的行。基于此顺序,OFFSET子句跳过前50行,由FETCH子句仅筛选上边包车型客车二五行。

此询问按orderdateorderid逐条(订单日期从最远到近期,并增多了决胜属性(tiebreaker)orderid)排序Orders表中的行。基于此顺序,OFFSET子句跳过前50行,由FETCH子句仅筛选下边的二五行。

  OFFSET 子句内定在从询问表明式中早先再次回到行从前,将跳过的行数。OFFSET
子句的参数能够是超乎或等于零的平头或表明式。ROW 和 ROWS
能够沟通使用。举例:

请注意,使用OFFSET-FETCH的查询必须具有ORDER
BY
子句。此外,FETCH子句不协理未有OFFSET子句。假诺你不想跳过别的行,但是期望选择FETCH筛选,你应该利用OFFSET
0
ROWS
来表示。不过,没有FETCHOFFSET是同意的,那种景色是跳过钦定的行数,并重回查询结果中持有剩余行。

请注意,使用OFFSET-FETCH的询问必须持有ORDER
BY
子句。此外,FETCH子句不援助未有OFFSET子句。假设您不想跳过其余行,可是指望利用FETCH筛选,你应当选择OFFSET
0
ROWS
来表示。不过,没有FETCHOFFSET是允许的,这种情景是跳过内定的行数,并赶回查询结果中具有剩余行。

  SELECT ColumnA, ColumnB FROM Table1 ORDER BY ColumnA OFFSET 10 ROWS

OFFSET-FETCH语法有壹部分有趣的语言方面供给留意。单数格式ROW和复数格式ROWS是能够调换的,此举是令你可见以直观的好像土耳其(Turkey)语格局来描述筛选。举例,假诺你仅希望取得1行,要是您内定了FETCH
1
ROWS
,就算那在语法上是立见作用的,但是看上去会很怪。由此,你可以行使FETCH
1
ROW
格式。此交流同样适用于OFFSET子句。别的,假如您不期望跳过任何行(OFFSET
0
ROWS
),你只怕感到“first”比“next”更适于,由此,FIRST 和NEXT格式是足以交换的。

OFFSET-FETCH语法有一些风趣的言语方面需求注意。单数格式ROW和复数格式ROWS是能够交流的,此举是让您可见以直观的近乎希腊语格局来描述筛选。举个例子,假若你仅希望获得壹行,若是您钦命了FETCH
1
ROWS
,固然这在语法上是卓有成效的,然而看上去会很怪。由此,你能够使用FETCH
1
ROW
格式。此沟通同样适用于OFFSET子句。其它,倘若你不指望跳过别的行(OFFSET
0
ROWS
),你可能以为“first”比“next”更得当,由此,FIRST 和NEXT格式是可以调换的。

 

如你所见,从引而不发跳过功效看,OFFSET-FETCH子句比TOP子句更加灵敏。但是,OFFSET-FETCH 不支持PERCENTWITH
TIES
选项,而TOP支持。由于OFFSET-FETCH是正统的,而TOP不是,笔者提出选择OFFSET-FETCH作为你的暗中同意选项,除非您须要TOP支持且OFFSET-FETCH不支持的功力。

如您所见,从引而不发跳过作用看,OFFSET-FETCH子句比TOP子句越来越灵敏。但是,OFFSET-FETCH 不支持PERCENTWITH
TIES
选项,而TOP支持。由于OFFSET-FETCH是明媒正娶的,而TOP不是,笔者提出采用OFFSET-FETCH用作你的暗中同意选项,除非你供给TOP支持且OFFSET-FETCH不协助的职能。

二. 跳过钦赐的行数,再回去内定的行数

 

 

  FETCH 子句不得以单独行使,必须跟在 OFFSET 子句之后。

  FETCH 子句钦命在管理 OFFSET 子句后,将回来的行数。FETCH
子句的参数能够是过量或等于 一 的平头或表达式。举例:

  SELECT ColumnA, ColumnB FROM Table1 ORDER BY ColumnA OFFSET 10
ROWS FETCH NEXT 5 ROWS ONLY

 

三. 参数调换

(一)ROW 和 ROWS 能够调换使用

  “一 ROWS”的抒发纵然 SQL Server 的语法,可是不切合英文语法,由此,ROW
和ROWS 能够交流,比方“一 ROW”。

 

(二)FI揽胜极光ST 和 NEXT 能够交流使用

  遭遇“OFFSET 0 ROWS”时(即不跳过任何行),“FETCH NEXT 伍 ROWS
ONLY”的表明看起来不太自然,因而,能够换为“FETCH FIPAJEROST 5 ROWS ONLY”。

 

四. 行数的表达式

  行数能够行使再次回到整数值的其余算术、常量或参数表明式,但不可以采纳标量子查询。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website