【实用技能】在 SQL Server 中使用 LIMIT 子句的替代方案

在数据库管理中,有效限制查询结果对于优化性能和确保检索相关数据至关重要。许多 SQL 数据库系统(例如 MySQL 和 PostgreSQL)都使用LIMIT子句来指定查询返回的记录数。但是,SQL Server 不支持该LIMIT子句,而是选择诸如TOP、和 之类的替代方案。这种设计选择反映了 SQL Server 对灵活性和性能的关注,提供了各种方法来实现类似的功能,同时满足不同的用例和场景。

让我们仔细看看LIMITSQL Server 中的替代方案,重点介绍它们的独特功能和局限性。

dbForge Studio for SQL Server官方正版下载

使用 SELECT TOP 子句

在 SQL Server 中,该SELECT TOP子句充当子句的替代LIMIT。同样,它用于限制查询返回的行数。当您处理大型数据集并且只想检索记录的子集时,它特别有用。基本语法是:

SELECT TOP (number | percent) column_names
FROM table_name;

此处,number代表要返回的确切行数,是percent返回的行数占总结果集的百分比。请根据需要使用这些参数之一。

您可以通过添加其他子句(比如WHERE or ORDER BY )来进一步优化结果。

例如,以下查询返回按受雇日期排序的前五名员工(此处和下面,我们将在示例中使用 AdventureWorks2022 示例数据库):

USE AdventureWorks2022;
SELECT TOP 5 *
FROM HumanResources.Employee
ORDER BY HireDate;

或者,此查询检索休假时间超过 20 小时的前 10% 员工的国家 ID 和职位:

USE AdventureWorks2022;
SELECT TOP 10 PERCENT NationalIDNumber, JobTitle
FROM HumanResources.Employee
WHERE VacationHours > 20;

使用该SELECT TOP子句有很多好处。首先,性能优化——它限制了结果集的大小,当只需要部分数据时,可以减少内存和处理负载。其次,它可用于通过仅检索当前页面所需的行来为大型结果集创建高效的分页。此外,通过限制返回的行数,它在测试大型表上的查询时也很有用。

请注意,SELECT TOP不提供随机行。要实现随机性,您可以将其与 结合使用,但这对于大型数据集来说效率低下。另一方面,如果不指定子句,结果可能是不可预测的,因为 SQL Server 不保证返回行的顺序。

使用 OFFSET-FETCH 实现分页

说到分页,另一个子句——OFFSET-FETCH——可以在 SQL Server 中使用来实现分页,它允许您通过跳过一定数量的行然后获取定义数量的行来检索特定的记录子集。此子句具有以下语法:

SELECT column_names
FROM table_name
ORDER BY column_name
OFFSET number_of_rows_to_skip ROWS
FETCH NEXT number_of_rows_to_return ROWS ONLY;

该OFFSET子句允许您指定在返回行之前需要跳过多少行,并FETCH NEXT定义在跳过的行之后返回多少行。

为了说明这一点,假设您需要跳过按 BusinessEntityID 排序的前 10 条记录并返回后 10 条记录,从而有效地获取分页结果中的第 2 页。您的查询将如下所示:

USE AdventureWorks2022;
SELECT *
FROM HumanResources.Employee
ORDER BY BusinessEntityID
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;

您还可以使用OFFSET-FETCH动态页面大小和页码。例如,此动态查询获取第 3 页的记录,假设每页大小为 10 行:

USE AdventureWorks2022;
DECLARE @PageSize INT = 10;
DECLARE @PageNumber INT = 3;
SELECT BusinessEntityID, JobTitle, HireDate
FROM HumanResources.Employee
ORDER BY BusinessEntityID
OFFSET (@PageSize * (@PageNumber - 1)) ROWS
FETCH NEXT @PageSize ROWS ONLY;

这种子句组合非常棒,因为它可以让您精确控制分页 — 这是一种简洁高效的分页处理方法,尤其适用于 Web 应用程序。此外,它遵循 SQL 标准,因此对于来自其他 RDBMS 的开发人员来说,它具有可移植性且易于理解。最重要的是,与其他方法(例如使用子查询)不同,它直接跳过并获取行,而无需复杂的解决方法。

但值得注意的是,对于大型数据集,分页越深(例如,第 1000 页),查询可能会变得越慢,因为 SQL Server 必须跳过更多行。另一个需要考虑的问题是,不返回总行数,因此如果您需要显示分页元数据(例如总页数),则需要额外的查询——来获取总行数。并且不要忘记,使用时必须使用子句;否则,结果是不可预测的。

使用 SET ROWCOUNT 命令

您可以使用SET ROWCOUNTSQL Server 中的命令来限制语句返回的行数SELECT或受UPDATE或影响的行数DELETE。该命令的语法如下:

SET ROWCOUNT { number | 0 }

而不是number您指定要返回或处理的行数,而是0重置行数。

如果将SET ROWCOUNTandSELECT与其他命令(例如ORDER BYand WHERE)一起使用,它们的交互作用会非常强大。在此组合中,WHERE子句首先筛选行,ORDER BY子句对筛选出的行进行排序,然后SET ROWCOUNT限制从排序结果集返回的行数。

下面是一个示例,我们只想检索按字母顺序排序(按职位)且休假时间超过 50 小时的员工的前五条记录,然后重置行数限制,以便将来的查询返回所有匹配的行:

USE AdventureWorks2022;
SET ROWCOUNT 5;
SELECT *
FROM HumanResources.Employee
WHERE VacationHours > 50
ORDER BY JobTitle;
SET ROWCOUNT 0;

SET ROWCOUNT使用数据修改命令(例如UPDATE或)DELETE的工作原理类似。让我们考虑一个更新数据的示例。运行此脚本将仅将具有 Stocker 职位的第一位员工的职位更改为 Chief Stocker,然后重置行数限制,并显示结果:

USE AdventureWorks2022;
SET ROWCOUNT 1;
UPDATE HumanResources.Employee
SET JobTitle = 'Chief Stocker'
WHERE JobTitle = 'Stocker';
SET ROWCOUNT 0;
-- To see the result of the update
SELECT *
FROM HumanResources.Employee
WHERE JobTitle LIKE ('%Stocker%')
ORDER BY JobTitle;

如您所见,SET ROWCOUNT提供了一种简单的方法来限制结果,而无需复杂的语法。与TOP有时需要子查询来实现更复杂的逻辑的命令不同,它SET ROWCOUNT可以直接与语句一起使用SELECT。但是,该SET ROWCOUNT命令被认为已弃用,因为它限制了结果集,而倾向于TOP使用提供更清晰语义的子句。

缺点是, 的效果SET ROWCOUNT是特定于会话的,这意味着必须在每个需要它的会话中设置它。此外,SET ROWCOUNT如果不小心使用,在更复杂的查询中使用可能会导致意想不到的结果。

请注意SET ROWCOUNT,现在越来越少使用了。SQL 标准已经发展,现代 SQL 实践更倾向于对结果集和数据操作进行更明确的控制。因此,Microsoft 建议改用子句TOP,因为SET ROWCOUNT不会影响SQL Server 2022 版本之后的未来版本中的DELETE和UPDATE语句。

使用 dbForge Studio 亲自尝试

我们将在 dbForge Studio for SQL Server 中尝试上述用例之一。

让我们首先检查 AdventureWorks2022 数据库的 HumanResources.Employee 表中有多少名员工担任营销专家职位。我们按如下方式执行此操作:

SELECTCOUNT(*) AS Count
FROM HumanResources.Employee
WHERE JobTitle = 'Marketing Specialist';

我们可以看到,共有五个:

我们想知道哪三位专家的未使用休假时间最多。我们使用以下查询:

SET ROWCOUNT 3;
SELECT*
FROM HumanResources.Employee
WHERE JobTitle = 'Marketing Specialist'
ORDER BY VacationHours DESC;
SET ROWCOUNT 0;

dbForge Studio 返回结果(为了演示的目的,我们改变了列的顺序):

为什么选择dbForge Studio for SQL Server?

我们相信,dbForge Studio 凭借其增强的用户界面和高级功能,比 SQL Server Management Studio (SSMS) 更出色。虽然 SSMS 围绕基础功能展开,但 dbForge Studio 提供了复杂的工具,如可视化查询构建、数据库比较和同步、数据聚合和分析、自动单元测试以及与版本控制系统的集成。这种对用户体验和强大功能的关注使 dbForge Studio 成为SQL Server 管理中SSMS 的有力替代方案。

总而言之,让我们简单比较一下LIMIT上面讨论的子句的 SQL Server 替代方案:

  • SELECT TOP:最适合从结果集中快速检索指定数量的行,尤其是当您需要固定限制时。非常适合只需要前 N 条记录的报告或仪表板。
  • OFFSET-FETCH:最适合大型数据集的分页。它允许您跳过指定数量的行并返回定义的集合,非常适合跨多页显示结果。
  • SET ROWCOUNT:用于限制旧版 SQL Server 中的行数或更新或删除特定数量的记录。但是,它的使用正在减少,取而代之的是TOP和OFFSET-FETCH。

因此,根据使用情况,每种方法都有其独特的优势。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/4192.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Apache-Hive数据库使用学习

前期准备 Hadoop-分布式部署(服务全部在线) Mysql-node1节点部署(确认安装正常) apache-hive -node1节点部署(需要与MySQL元数据联动存储) 参考博客: Hadoop Hadoop集群搭建-完全分布式_hadoop完…

Webserver(3.2)锁

目录 互斥量死锁未解锁重复加锁多个锁 读写锁案例 互斥量 接上一章&#xff0c;卖票存在线程安全问题。 #include<stdio.h> #include<pthread.h> #include<unistd.h> int tickets1000;//局部变量就是每个人卖100张&#xff0c;全局变量就是一起卖100张&…

105. UE5 GAS RPG 搭建主菜单

在这一篇&#xff0c;我们将实现对打开游戏显示的主菜单进行搭建&#xff0c;主菜单将显示游戏主角&#xff0c;游戏名称和进入游戏和退出游戏两个按钮。 搭建菜单场景 我们将主菜单设置为一个单独的场景&#xff0c;前面可以显示对应的UI控件&#xff0c;用于玩家操作&#…

语义分割——U-Net

U-Net是继FCN之后又一个经典的语义分割网络模型&#xff0c;并且也是很多后续语义分割模型的“祖宗”。这个网络模型是2015年提出来的&#xff0c;它具有一个非常对称的结构&#xff0c;很像字母“U”&#xff0c;所以被称作U-Net。U-Net被广泛应用于医学影像领域&#xff0c;如…

AI之硬件对比:据传英伟达Nvidia2025年将推出RTX 5090-32GB/RTX 5080-24GB、华为2025年推出910C/910D

AI之硬件对比&#xff1a;据传英伟达Nvidia2025年将推出RTX 5090-32GB/RTX 5080-24GB、华为2025年推出910C/910D 目录 Nvidia的显卡 Nvidia的5090/5080/4090/4080&#xff1a;据传传英伟达Nvidia RTX 5090后续推出32GB版且RTX 5080后续或推出24GB版 RTX 5090相较于RTX 4090&…

Android无限层扩展多级recyclerview列表+实时搜索弹窗

业务逻辑&#xff1a; 点击选择&#xff0c;弹出弹窗&#xff0c;列表数据由后台提供&#xff0c;不限层级&#xff0c;可叠加无限层子级&#xff1b; 点击item展开收起&#xff0c;点击尾部icon单选选中&#xff0c;点击[确定]为最终选中&#xff0c;收起弹窗&#xff1b; 搜索…

SpringBoot+ClickHouse集成

前面已经完成ClickHouse的搭建&#xff0c;创建账号&#xff0c;创建数据库&#xff0c;保存数据库等&#xff0c;接下来就是在SpringBoot项目中集成ClickHouse。 一&#xff0c;引入依赖 <!-- SpringBoot集成ClickHouse --> <dependency><groupId>com.baom…

【基于轻量型架构的WEB开发】课程 12.5 数据回写 Java EE企业级应用开发教程 Spring+SpringMVC+MyBatis

12.5 数据回写 12.5.1 普通字符串的回写 接下来通过HttpServletResponse输出数据的案例&#xff0c;演示普通字符串的回写&#xff0c;案例具体实现步骤如下。 1 创建一个数据回写类DataController&#xff0c;在DataController类中定义 showDataByResponse()方法&#xff…

Java实现JWT登录认证

文章目录 什么是JWT?为什么需要令牌?如何实现?添加依赖&#xff1a;JwtUtils.java&#xff08;生成、解析Token的工具类&#xff09;jwt配置&#xff1a;登录业务逻辑&#xff1a;其他关联代码&#xff1a;测试&#xff1a; 什么是JWT? JWT&#xff08;Json Web Token&…

光伏无人机踏勘,照亮光伏未来!

光伏电站选址地分散在各地&#xff0c;想要精准获取该地的地形特点与屋顶面积等信息&#xff0c;传统的人工踏勘耗时耗力且精度无法保证&#xff0c;难以满足现代光伏项目的规模快发发展需求。光伏无人机踏勘&#xff0c;照亮光伏未来&#xff01; 在光伏无人机智能踏勘设计系统…

Vue全栈开发旅游网项目(7)-搜索界面开发及其接口联调

1.搜索界面开发 1.1 模糊查询 文件地址&#xff1a;pycharm- class SightListView(ListView):paginate_by 5def get_queryset(self):#is_validTrue&#xff1a;表中is_valid列&#xff0c;有值则被查询出来query Q(is_validTrue)#1.获得热门景点is_hot self.request.GET.…

『 Linux 』网络传输层 - TCP(二)

文章目录 TCP六个标志位TCP的连接三次握手 四次挥手为什么是三次握手和四次挥手 重传机制 TCP六个标志位 在TCP协议报文的报头中存在一个用于标志TCP报文类型的标志位(不考虑保留标志位),这些标志位以比特位选项的方式存在,即对应标志位为0则表示为假,对应标志位为1则为真; SYN…

Django学习-项目部署

WSGI定义&#xff1a; uWSGI定义&#xff1a; 安装uWSGI&#xff1a; 配置uWSGI&#xff1a; uWSGI常见问题汇总&#xff1a; 安装nginx&#xff1a; 配置&#xff1a; 启动/停止dnginx 修改uWSGI配置&#xff1a; 常见问题解决方法&#xff1a; nginx静态文件配置&#xff…

迅为RK3588开发板Android多屏显示之多屏同显和多屏异显

迅为RK3588开发板是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像…

QML项目实战:自定义Button

目录 一.添加模块 ​1.QtQuick.Controls 2.1 2.QtGraphicalEffects 1.12 二.自定义Button 1.颜色背景设置 2.设置渐变色背景 3.文本设置 4.点击设置 5.阴影设置 三.效果 1.当enabled为true 2.按钮被点击时 3.当enabled为false 四.代码 一.添加模块 1.QtQuick.Con…

基于C#实现Windows后台窗口操作与图像处理技术分析

在Windows编程中&#xff0c;操作后台窗口是一项复杂而有用的技术。它可以用来自动化用户界面测试、应用程序机器人等场景。本文将深入探讨如何在C#中绑定后台窗口、获取后台窗口界面图片&#xff0c;以及在图片中寻找指定图标并获取坐标。本技术文章结合最先进的资料与实践经验…

数据库基础(1) . 关系型数据库

1.数据库 database 1.1.数据持久化 数据持久化&#xff08;Data Persistence&#xff09;指的是将程序中的数据保存到某种持久化的存储介质&#xff08;如硬盘、SSD、磁带等&#xff09;上的过程&#xff0c;使得即使在程序终止后&#xff0c;数据依然可以被保留下来并在下次…

Python学习的自我理解和想法(27)

学的是b站的课程&#xff08;千锋教育&#xff09;&#xff0c;跟老师写程序&#xff0c;不是自创的代码&#xff01; 今天是学Python的第27天&#xff0c;学的内容是python操作pptx和pdf&#xff0c;但是这节博客只会介绍如何新建pptx和加密pdf。开学了&#xff0c;时间不多&…

鸿蒙移动应用开发-------初始arkts

一. 什么是arkts ArkTS是HarmonyOS优选的主力应用开发语言。 ArkTS围绕应用开发在TypeScript&#xff08;简称TS&#xff09;生态基础上做了进一步扩展&#xff0c;保持了TS的基本风格&#xff0c;同时通过规范定义强化开发期静态检查和分析&#xff0c;提升程序执行稳定性和…