九月 5, 2023
摘要:在本教程中,您将学习如何使用 PostgreSQL 的 FETCH 子句来检索查询返回的部分行。
目录
PostgreSQL FETCH 子句简介
为了限制查询返回的行数,您经常使用LIMIT子句。LIMIT子句被许多关系数据库管理系统广泛使用,例如 MySQL、H2 和 HSQLDB。但是,LIMIT子句不是 SQL 标准。
为了符合 SQL 标准,PostgreSQL 支持FETCH子句来检索查询返回的行数。
请注意,
FETCH子句是在 SQL:2008 中作为 SQL 标准的一部分引入的。
下面说明了 PostgreSQL 的FETCH子句的语法:
OFFSET start { ROW | ROWS }
FETCH { FIRST | NEXT } [ row_count ] { ROW | ROWS } ONLY
在这个语法中:
ROW是ROWS的同义词,FIRST是NEXT的同义词。所以你可以互换使用它们。start是一个整数,必须为零或正数。默认情况下,如果未指定OFFSET子句,则该值为零。如果start大于结果集中的行数,则不返回任何行;row_count是 1 或更大。默认情况下,如果不显式指定row_count,则默认值为 1。
由于表中存储的行顺序是未指定的,因此在使用FETCH子句时应始终带有ORDER BY子句,以使返回的结果集中的行顺序一致。
请注意,在 SQL:2008 标准中,
OFFSET子句必须位于FETCH子句之前。但是,OFFSET和FETCH子句可以以任何顺序出现在 PostgreSQL 中。
FETCH 对比 LIMIT
FETCH子句在功能上等同于LIMIT子句。如果您计划使您的应用程序与其他数据库系统兼容,则应该使用FETCH子句,因为它遵循 SQL 标准。
PostgreSQL FETCH 示例
我们使用示例数据库中的film表进行演示。

以下语句使用 FETCH 子句查询按标题升序排列的第一部电影:
SELECT
film_id,
title
FROM
film
ORDER BY
title
FETCH FIRST ROW ONLY;
输出:
film_id | title
---------+------------------
1 | Academy Dinosaur
(1 row)
它相当于以下查询:
SELECT
film_id,
title
FROM
film
ORDER BY
title
FETCH FIRST 1 ROW ONLY;
以下语句使用FETCH子句查询按标题排序的前五部电影:
SELECT
film_id,
title
FROM
film
ORDER BY
title
FETCH FIRST 5 ROW ONLY;
输出:
film_id | title
---------+------------------
1 | Academy Dinosaur
2 | Ace Goldfinger
3 | Adaptation Holes
4 | Affair Prejudice
5 | African Egg
(5 rows)
以下语句返回按标题排序的前五部电影之后的接下来的五部电影:
SELECT
film_id,
title
FROM
film
ORDER BY
title
OFFSET 5 ROWS
FETCH FIRST 5 ROW ONLY;
输出:
film_id | title
---------+------------------
6 | Agent Truman
7 | Airplane Sierra
8 | Airport Pollock
9 | Alabama Devil
10 | Aladdin Calendar
(5 rows)
在本教程中,您学习了如何使用 PostgreSQL 的 FETCH 子句来检索查询返回的部分行。