当前位置: 首页 > article >正文

SQL Sever 基础知识 - 限制行数

SQL Sever 基础知识 - 三、限制行数

  • 三、限制行数
    • 第1节 OFFSET FETCH - 限制查询返回的行数
      • 1.1 OFFSET 和 FETCH 子句
      • 1.2 SQL Server OFFSET 和 FETCH 示例
    • 第2节 SELECT TOP - 限制查询结果集中返回的行数或行的百分比
      • 2.1 SELECT TOP 子句
      • 2.2 PERCENT
      • 2.3 WITH TIES
      • 2.4 SELECT TOP 示例
        • 2.4.1 使用带有常量值的 TOP
        • 2.4.2 使用 TOP 返回行的百分比
        • 2.4.3 使用 TOP WITH TIES 包含与最后一行中的值匹配的行

更多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个年龄相同的顾客。


http://www.kler.cn/a/158711.html

相关文章:

  • 3、C语言基本数据类型关键字
  • R语言-快速对多个变量取交集
  • Linux守护Pythom脚本运行——Supervisor学习总结
  • 两大新兴开发语言大比拼:Move PK Rust
  • 香港站群服务器有助于提升网站在搜索引擎中的排名
  • java设计模式之 - 适配器模式
  • NLP/Natural Language Processing
  • 春秋云镜ED01-CMS v20180505 存在任意文件上传漏洞
  • 【面试】Java最新面试题资深开发-JVM第一弹
  • 基于机器深度学习的交通标志目标识别
  • 智能故障诊断期刊推荐【英文期刊】
  • 华为OD机试真题-CPU算力分配-2023年OD统一考试(C卷)
  • 《微信小程序开发从入门到实战》学习四十一
  • 广域网(WAN)设备通信过程(通信流程、通信步骤、通信顺序、设备通信、主机通信)(MAC地址在本地链路中的作用)跳跃(hop)
  • 【算法思考记录】力扣2477. 到达首都的最少油耗【Java,深度优先搜索】
  • LoadBalancer将服务暴露到外部实现负载均衡metallb-layer2模式配置介绍
  • 手机大厂必备测试技能有哪些?CTS 兼容测试首当其冲
  • Jinja2使用Layui报 “d is not defined“
  • ASEM工控机维修工业电脑控制器维修PB3400
  • 【Vulnhub 靶场】【HackathonCTF: 2】【简单】【20210620】
  • 龙芯loongarch64服务器编译安装maturin
  • 外包干了8个月,技术退步明显.......
  • 什么是上采样和下采样?
  • Java8实战-总结50
  • rcssci包横空出世,限制性立方样条全自动切点靓图
  • 【计算机系统基石与Linux进程管理深度解析】