暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

排序和限制-FETCH

FortuneXu 2025-10-27
15

摘要: 在本教程中,你将学习如何使用 PostgreSQLFETCH 子句从查询中检索部分行。

PostgreSQL FETCH 简介

PostgreSQL 中,OFFSET 子句的作用类似于 LIMIT 子句。FETCH 子句允许你限制查询返回的行数。

LIMIT 子句并非 SQL 标准的一部分。不过,FETCH 子句是 SQL:2008 标准的一部分。如果您希望您的应用程序在未来支持其他数据库,请使用 FETCH 而非 LIMIT ,因为其他数据库供应商很可能会支持它。

以下是 OFFSET FETCH 子句的语法:

SELECT column1, column2 FROM table_name ORDER BY sort_expression OFFSET skip_count FETCH { FIRST | NEXT } ] [row_count] {ROW | ROWS } ONLY;

在此语法中:

首先,在 FROM 子句中指定你想要检索数据的表的名称。

其次,在 SELECT 子句中限制最终结果集中要包含的行中的哪些列。

第三,使用 ORDER BY 子句按一列或多列中的值对行进行排序。

第四,在 FETCH 子句返回行的子集之前,在 OFFSET 子句中提供要跳过的行数:

OFFSET skip_count

skip_count 用于确定要跳过的行数。它可以是零或正整数。如果 skip_count 为零,查询将不会跳过任何行。

OFFSET 子句是可选的。如果省略该子句,查询也不会跳过任何行。

第五,在 FETCH 子句中设置要返回的行数 (row_count)

row_count 的默认值为 1,这意味着如果省略它,FETCH 将从查询中返回一行数据。

你可以交替使用 FIRSTNEXTROW 以及 ROWS ,因为它们是同义词。

例如:

FETCH FIRST 1 ROW ONLY; FETCH FIRST ROW ONLY; FETCH FIRST 10 ROWS ONLY; FETCH NEXT 1 ROW ONLY; FETCH NEXT ROW ONLY; FETCH NEXT 10 ROWS ONLY;

设置示例表

我们将使用在 LIMIT 教程中创建的 products 表来练习 FETCH 子句。

以下是创建 products 表并插入一些行的SQL脚本。

CREATE TABLE products ( product_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name VARCHAR(255) NOT NULL, price DECIMAL(10, 2) ); INSERT INTO products (name, price) VALUES ('iPhone 16 Pro Max', 1649.00), ('iPhone 16', 829.00), ('Galaxy S24 Ultra', 1299.99), ('Galaxy S24 FE', 949.99), ('Pixel 9 Pro', 799.00), ('Pixel 8a', 399.00), ('OnePlus 12', 745.00), ('OnePlus Open', 1514.99), ('Galaxy Z Fold 6', 2019.99);
product_id name price
1 iPhone 16 Pro Max 1649.00
2 iPhone 16 829.00
3 Galaxy S24 Ultra 1299.99
4 Galaxy S24 FE 949.99
5 Pixel 9 Pro 799.00
6 Pixel 8a 399.00
7 OnePlus 12 745.00
8 OnePlus Open 1514.99
9 Galaxy Z Fold 6 2019.99

获取第一行

以下语句使用 FETCH 子句从 products 表中查询最昂贵的产品:

SELECT name, price FROM products ORDER BY price DESC FETCH FIRST ROW ONLY;

输出:

name | price -----------------+--------- Galaxy Z Fold 6 | 2019.99

获取一些行

以下示例使用 FETCH 子句从 products 表中检索价格最高的三种产品:

SELECT name, price FROM products ORDER BY price DESC FETCH FIRST 3 ROWS ONLY;

输出:

name | price -------------------+--------- Galaxy Z Fold 6 | 2019.99 iPhone 16 Pro Max | 1649.00 OnePlus Open | 1514.99

在获取之前跳过一些行

以下语句使用 OFFSETFETCH 子句从 products 表中获取第二贵的产品:

SELECT name, price FROM products ORDER BY price DESC OFFSET 1 FETCH NEXT 1 ROW ONLY;

输出:

name | price -------------------+--------- iPhone 16 Pro Max | 1649.00

使用 PostgreSQLFETCH 子句进行分页

FETCH 子句有助于实现分页:

OFFSET record_per_page * (page_no - 1) FETCH NEXT record_per_page ROWS ONLY.

在此语法中:

  • record_per_page 是每页的记录数量。
  • page_no 是页码,例如 1、2、3

假设你希望每页显示3个产品 (record_per_page) ,并想获取第2页的产品 (page_no),你可以使用以下查询:

SELECT name, price FROM products ORDER BY price DESC OFFSET 3 * (2 - 1) FETCH NEXT 3 ROW ONLY;

输出:

name | price ------------------+--------- Galaxy S24 Ultra | 1299.99 Galaxy S24 FE | 949.99 iPhone 16 | 829.00

总结

  • 使用 PostgreSQLFETCH 从查询中返回部分行。
  • 使用 OFFSET FETCH 在返回部分行之前跳过一些行。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论