SQL Server OFFSET FETCH

17 Mar 2025 | 4 分钟阅读

本文将解释使用 OFFSET FETCH 功能来检索有限内存记录并避免内存不足异常。 SQL Server 中的 FETCH 和 OFFSET 子句与 SELECT 和 ORDER BY 子句结合使用,以限制查询返回的记录范围。它于 2012 年 SQL Server 版本中首次引入,用于对结果集进行分页。当我们的数据库包含大量数据时,它非常有用。

OFFSET 和 FETCH 的用法

OFFSET:此子句用于指定从结果集返回行的起始点。 基本上,它会忽略初始记录集。 SQL Server 只能与 ORDER BY 子句一起使用。 如果它的值为负数,将返回一个错误。 因此,它应该始终大于或等于零。

FETCH:这是一个可选子句,提供我们希望在查询的 OFFSET 之后返回的行数。 我们不能在没有 OFFSET 的情况下使用它。 它的值不能为负数,类似于 OFFSET。 因此,它应该始终大于或等于零; 否则,它将抛出错误。

语法

以下是说明 OFFSET 和 FETCH 子句使用的语法

在此语法中,我们定义了要从中检索数据的表名。 接下来,我们指定了ORDER BY 子句,用于按升序或降序显示记录。 接下来,我们指定了OFFSET 以跳过记录数,最后,FETCH 用于返回记录集。

示例

让我们实际了解 OFFSET 和 FETCH 子句的用法。 假设我们有一个名为customer的表,其中包含以下数据

SQL Server OFFSET FETCH

假设您想获取从 5 开始,直到接下来四行的记录范围。 我们可以通过使用 OFFSET 和 FETCH 子句轻松做到这一点。 这是查询

执行该语句将返回以下输出,其中 OFFSET 5 跳过五行,FETCH 4 ROWS ONLY 显示所需的结果。

SQL Server OFFSET FETCH

如果我们要跳过前五个客户记录并返回其余记录,我们只需要使用 OFFSET 子句,如下面的查询所示

执行该语句将返回所需的输出

SQL Server OFFSET FETCH

如果我们要根据客户名称的升序检索前 6 个客户,我们需要同时使用 OFFSET 和 FETCH 子句,如下所示

执行查询将返回所需的结果

SQL Server OFFSET FETCH

如果我们要获取客户的最后三条记录(按其名称排序),我们可以使用 OFFSET 和 FETCH 子句,如下所示

执行查询将返回所需的结果

SQL Server OFFSET FETCH

如果我们在没有 OFFSET 子句的情况下执行上述语句,我们将得到一个错误

SQL Server 将抛出以下错误消息

SQL Server OFFSET FETCH

TOP 和 OFFSET & FETCH 子句的区别

TOP 和 OFFSET FETCH 子句都用于限制 SQL Server 中查询返回的行数。 但是,它们有一些区别,如下表所述

TOPOFFSET & FETCH
TOP 子句只能从查询结果中返回特定记录。OFFSET 和 FETCH 返回查询中的记录集。 OFFSET 用于跳过行数,FETCH 提供我们希望在结果中 OFFSET 之后返回的行数。
TOP 不符合 ANSI 标准,因此只能与 Microsoft 产品(如 SQL Server 和 MS-Access)一起使用。OFFSET 和 FETCH 子句符合 ANSI 标准,这些子句最近被添加到 SQL Server 2012 中。
TOP 子句可以在 SELECT 语句的列列表中使用,无论是否带有 ORDER BY。它应该始终与 ORDER BY 子句一起使用。
它无法从结果的中间返回记录。它可以从结果的中间返回记录。
它支持 SQL Server 2005 及更高版本。它支持 SQL Server 2012 及更高版本。