百度建站企业年报查询
摘要: 在本教程中,你将学习如何使用 PostgreSQL 的 FETCH 子句从查询中检索部分行。
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 将从查询中返回一行数据。
你可以交替使用 FIRST 和 NEXT 、ROW 以及 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 INTOproducts (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 表中查询最昂贵的产品:
SELECTname,price
FROMproducts
ORDER BYprice DESC
FETCH FIRST ROW ONLY;
输出:
name | price
-----------------+---------Galaxy Z Fold 6 | 2019.99
获取一些行
以下示例使用 FETCH 子句从 products 表中检索价格最高的三种产品:
SELECTname,price
FROMproducts
ORDER BYprice DESC
FETCH FIRST 3 ROWS ONLY;
输出:
name | price
-------------------+---------Galaxy Z Fold 6 | 2019.99iPhone 16 Pro Max | 1649.00OnePlus Open | 1514.99
在获取之前跳过一些行
以下语句使用 OFFSET 和 FETCH 子句从 products 表中获取第二贵的产品:
SELECTname,price
FROMproducts
ORDER BYprice DESC
OFFSET 1
FETCH NEXT 1 ROW ONLY;
输出:
name | price
-------------------+---------iPhone 16 Pro Max | 1649.00
使用 PostgreSQL 的 FETCH 子句进行分页
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),你可以使用以下查询:
SELECTname,price
FROMproducts
ORDER BYprice DESC
OFFSET 3 * (2 - 1)
FETCH NEXT 3 ROW ONLY;
输出:
name | price
------------------+---------Galaxy S24 Ultra | 1299.99Galaxy S24 FE | 949.99iPhone 16 | 829.00
总结
- 使用
PostgreSQL的FETCH从查询中返回部分行。 - 使用
OFFSET FETCH在返回部分行之前跳过一些行。
