本文介绍: SQL Sever 的OFFSET 和FETCH子句和TOP关键字使用,主要目的是对SELECT 语句返回结果集进行行数选择

更多SQL Sever基础知识查看SQL Sever 基础知识(全)

特别说明
  本文章所用的所有数据库数据表及其数据皆为AI随机生成,不涉及个人隐私,且仅供学习使用

三、限制行数

第1节 OFFSET FETCH – 限制查询返回行数

SQL Server使用 OFFSET FETCH 子句来限制查询返回的行数。

1.1 OFFSET 和 FETCH 子句

OFFSETFETCH 子句是 ORDER BY 子句的选项。它们允许限制查询返回的行数。
以下说明 OFFSET 和 FETCH 子句的语法

ORDER BY column_list [ASC |DESC]
OFFSET offset_row_count {ROW | ROWS}
FETCH {FIRST | NEXT} fetch_row_count {ROW | ROWS} ONLY

在此语法中:
OFFSET 子句指定在开始从查询返回行之前要跳过的行数。 offset_row_count 可以大于等于零的常量变量参数

FETCH 子句指定处理OFFSET 子句之后要返回的行数。 offset_row_count 可以是大于等于1的常量变量标量

OFFSET 子句是强制性的,而 FETCH 子句是可选的。此外, FIRSTNEXT同义词,因此可以互换使用

下图说明OFFSETFETCH 子句:
在这里插入图片描述

Note
① 必须将 OFFSETFETCH 子句与 ORDER BY 子句一起使用,否则会报错
② 与 TOP 子句相比, OFFSET 和 FETCH 子句更适合实现查询分页解决方案

1.2 SQL Server OFFSET 和 FETCH 示例

新建一个CustomerInfo数据表作为学习案例

CREATE TABLE CustomerInfo (
    CusID INT IDENTITY(10001,1) PRIMARY KEY,
    CusName VARCHAR(50) NOT NULL,
    Gender VARCHAR(10),
    Age INT,
    Phone VARCHAR(20),
    Province VARCHAR(50),
    City VARCHAR(50),
    Status VARCHAR(20)
);

查询返回 CustomerInfo 表中的所有客户的CusName,Gender,Age,Status,并对Age进行排序

 select CusName,Gender,Age,Status
 from CustomerInfo
 order by Age,CusName;

执行结果
在这里插入图片描述

要跳过前10个客人信息并返回其余客人,使用 OFFSET 子句:

 select CusName,Gender,Age,Status
 from CustomerInfo
 order by Age,CusName
 offset 10 rows;

执行结果
在这里插入图片描述

对比前结果,可发现数据集跳过前10行。

要跳过前10个客人信息并返回接下来的10个客人,可同时使用 OFFSETFETCH 子句,如下所示

 select CusName,Gender,Age,Status
 from CustomerInfo
 order by Age,CusName
 offset 10 rows 
 fetch first 10 rows only;

执行结果
在这里插入图片描述
对比前结果,可发现数据集跳过前10行后取到接着的10行数据即结果集的11-20行数据

如果只取前10个客人信息并可同时使用 OFFSETFETCH 子句,如下所示:

 select CusName,Gender,Age,Status
 from CustomerInfo
 order by Age,CusName
 offset 0 rows 
 fetch first 10 rows only;

执行结果:
在这里插入图片描述
跳过0行,取接后的10行就为前10行,对比前面数据发现取数成功

第2节 SELECT TOP – 限制查询结果集中返回的行数或行的百分比

使用SQL Server SELECT TOP 语句来限制查询返回的行。

2.1 SELECT TOP 子句

因为存储表中的行的顺序是未指定的,所以 SELECT TOP 语句总是与 ORDER BY 子句一起使用。因此,结果集仅限于第 N 个有序行。
SELECT 语句的 TOP 子句的语法

select top (expression) [PERCENT][WITH TIES]
from [表名]
ORDER BY <列名>

在此语法中, SELECT 语句可以有其他子句,如 WHERE 、 JOIN 、 HAVING 和 GROUP BY 。
TOP 关键字后面是一个表达式,它指定要返回的行数。如果使用 PERCENT ,表达式将被计算为浮点值,否则,它将被转换为 BIGINT 值。

2.2 PERCENT

PERCENT 关键字表示查询返回前 N 百分比的行,其中 N 是 expression 的结果。

2.3 WITH TIES

WITH TIES 允许您返回更多行,其值与有限结果集中最后一行匹配。请注意, WITH TIES 可能会导致返回的行数比您在表达式中指定的要多。
【举个栗子】如果想查询年度总成绩第一的学生评优,可以使用 TOP 1查询 。但是,如果有多个分数学生top 1 只会返回一个学生信息。为了避免这种情况,需要使用 TOP 1 WITH TIES,可返回同分数的所有学生信息
实例:取客户信息表中年龄最大用户信息(TOP 1 )

 select top 1 *
 from CustomerInfo
 order by Age desc

执行结果:

CusID	CusName	Gender	Age	Phone	Province	City	Status
10006	张建国	Male	33	15036987451	广西省	南宁市	派送中

客户信息表中年龄最大用户信息(TOP 1 WITH TIES)

 select top 1 with ties *
 from CustomerInfo
 order by Age desc

执行结果

CusID	CusName	Gender	Age	Phone	Province	City	Status
10006	张建国	Male	33	15036987451	广西省	南宁市	派送中
10022	王秀华	Female	33	17625369226	广东省	深圳市	在途中
10039	王宇宇	Male	33	17625369233	广西省	南宁市	派送中
10045	王海洋	Male	33	17625369230	广东省	广州市	在途中
10057	李佳佳	Female	33	19851362471	浙江省	宁波市	已签收
10070	王建华	Male	33	17625369234	广东省	深圳市	在途中

2.4 SELECT TOP 示例

2.4.1 使用带有常量值的 TOP

查询前十个年龄最大的用户信息:

 select top 10 *
 from CustomerInfo
 order by Age desc
2.4.2 使用 TOP 返回行的百分比

查询前(占总数据的10%的数)个年龄最大的用户信息:

 select top 10 PERCENT *
 from CustomerInfo
 order by Age desc

使用 PERCENT 指定结果集中返回百分比个数,CustomerInfo表中共有78行数据,78的百分之十是一个小数值( 7.8 ),SQL Server将其四舍五入到下一个整数,在这种情况下是8,即返回数据的前8行。
执行结果:
在这里插入图片描述

2.4.3 使用 TOP WITH TIES 包含最后一行中的值匹配的行

查询年龄排前十的客户信息:

 select top 10 with ties *
 from CustomerInfo
 order by Age desc

执行结果:
在这里插入图片描述
在此示例中,第10名年龄为32,因为语句使用了 TOP WITH TIES语句 ,所以它返回了另外6个年龄相同的顾客。

原文地址:https://blog.csdn.net/emmmheng/article/details/134729448

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_45306.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注