SQL分页查询方式汇总

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

1:TOP()

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

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

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;

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

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

4: SQL Server 2012的OFFSET-FETCH筛选

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

这里第4中方法做详细介绍:

TOP选项是一个非常实用的筛选类型,但它有两个缺陷——不是标准SQL,且不支持跳过功能。标准SQL定义的TOP类似筛选称为OFFSET-FETCH,支持跳过功能,这对针对特定页面的查询非常有用。SQL Server2012引入了对OFFSET-FETCH筛选的支持。

SQL Server 2012中的OFFSET-FETCH筛选被视为ORDER BY子句的一部分,通常用于实现按顺序显示效果。OFFSET子句指定要跳过的行数,FETCH子句指定在跳过的行数后要筛选的行数。请思考一下下面的查询示例。

SELECT orderid, orderdate, custid, empid FROM Sales.Orders ORDER BY orderdate, orderid OFFSET 50 ROWS FETCH NEXT 25 ROWS ONLY;

此查询按orderdate、orderid顺序(订单日期从最远到最近,并添加了决胜属性(tiebreaker)orderid)排序Orders表中的行。基于此顺序,OFFSET子句跳过前50行,由FETCH子句仅筛选下面的25行。

请注意,使用OFFSET-FETCH的查询必须具有ORDER BY子句。此外,FETCH子句不支持没有OFFSET子句。如果你不想跳过任何行,但是希望使用FETCH筛选,你应当使用OFFSET 0 ROWS来表示。不过,没有FETCH的OFFSET是允许的,这种情况是跳过指定的行数,并返回查询结果中所有剩余行。

OFFSET-FETCH语法有一些有趣的语言方面需要注意。单数格式ROW和复数格式ROWS是可以互换的,此举是让你能够以直观的类似英语方式来描述筛选。例如,假设你仅希望获取一行,如果你指定了FETCH 1 ROWS,虽然这在语法上是有效的,不过看上去会很怪。因此,你可以使用FETCH 1 ROW格式。此互换同样适用于OFFSET子句。另外,如果你不希望跳过任何行(OFFSET 0 ROWS),你可能觉得“first”比“next”更合适,因此,FIRST 和NEXT格式是可以互换的。

如你所见,从支持跳过功能看,OFFSET-FETCH子句比TOP子句更灵活。不过,OFFSET-FETCH 不支持PERCENT和WITH TIES选项,而TOP支持。由于OFFSET-FETCH是标准的,而TOP不是,我建议使用OFFSET-FETCH作为你的默认选择,除非你需要TOP支持且OFFSET-FETCH不支持的功能。

以上所述是小编给大家介绍的SQL分页查询方式汇总,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

时间: 2024-10-23 20:03:16

SQL分页查询方式汇总的相关文章

SQL分页查询方式汇总_MsSql

需求:查询表dbo.Message,每页10条,查询第2页 1:TOP() SELECT TOP(20) * FROM dbo.Message WHERE Code NOT IN (SELECT TOP(10) Code FROM dbo.Message) 2:BETWEEN * AND * , Row_Number() OVER(ORDER BY *) AS rowNum SELECT *,ROW_NUMBER() OVER(ORDER BY Code) AS rowNum INTO #a F

SQL两种简单分页查询方式

                   以前我们或许都用过了linq的skip and take方式进行分页查询,但是很少自己写sql的分页查询,因为大多数时候,我们都是在调用别人的方法.              最近看到一个文档,感觉方法里面实现的分页查询进入数据库调用的时候,实际最底层调用的还是SQL的分页查询,例如,我们用linq写个分页查询,转成sql表达式后发现:                               实际调用的时候,才发现SQL底层是这样进行分页的.      

sql分页查询几种写法_MsSql

关于SQL语句分页,网上也有很多,我贴一部分过来,并且总结自己已知的分页到下面,方便日后查阅 1.创建测试环境,(插入100万条数据大概耗时5分钟). create database DBTest use DBTest --创建测试表 create table pagetest ( id int identity(1,1) not null, col01 int null, col02 nvarchar(50) null, col03 datetime null ) --1万记录集 declar

sql分页查询几种写法

关于SQL语句分页,网上也有很多,我贴一部分过来,并且总结自己已知的分页到下面,方便日后查阅 1.创建测试环境,(插入100万条数据大概耗时5分钟). create database DBTest use DBTest --创建测试表 create table pagetest ( id int identity(1,1) not null, col01 int null, col02 nvarchar(50) null, col03 datetime null ) --1万记录集 declar

SQL分页查询代码

SQL Server 关于分页 SQL 的资料许多,有的使用存储过程,有的使用游标.本人不喜欢使用游标,我觉得它耗资.效率低:使用存储过程是个不错的选择,因为存储过程是颠末预编译的,执行效率高,也更灵活.先看看单条 SQL 语句的分页 SQL 吧. 方法1: 适用于 SQL Server 2000/2005 SELECT TOP 页大小 * FROM table1 WHERE id NOT IN ( SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id

SQL分页查询存储过程实例代码

话不多说,请看代码 ------------------------------------- -----作者:张欣宇 -----时间:2013-06-28 -----简介:根据参数和条件分页查询 ------------------------------------- Createproc [dbo].[Up_PagingQueryByParameter] (  ----- 表名或能查询到结果的SQL语句{SQL语句左右必须有括号例:(select * from tbl1)}  @Table

二种sql分页查询语句分享_MsSql

根据题意理解: 本质就是写分页查询: 每页条数:10条: 当前页码:4页: 复制代码 代码如下: //第一种:select * from (select ROW_NUMBER() over(order by Id asc) as num,* from UserInfo)as u where u.num between 10*(4-1)+1 and 10*4//第二种:select top 10 * from UserInfo where Id not in(select top (10*3) i

二种sql分页查询语句分享

根据题意理解: 本质就是写分页查询: 每页条数:10条: 当前页码:4页: 复制代码 代码如下://第一种:select * from (select ROW_NUMBER() over(order by Id asc) as num,* from UserInfo)as u where u.num between 10*(4-1)+1 and 10*4//第二种:select top 10 * from UserInfo where Id not in(select top (10*3) id

三种SQL分页查询的存储过程代码

复制代码 代码如下: --根据MAX(MIN)ID CREATE PROC [dbo].[proc_select_id] @pageindex int=1,--当前页数 @pagesize int=10,--每页大小 @tablename VARCHAR(50)='',--表名 @fields VARCHAR(1000)='',--查询的字段集合 @keyid VARCHAR(50)='',--主键 @condition NVARCHAR(1000)='',--查询条件 @orderstr VA