摘要
在本教程中,您将学习如何使用 PostgreSQL 的 FETCH
子句来只检索查询结果中的一部分行。
在 SELECT
语句中,如果要跳过若干行并仅取回指定数量的行,通常会使用 LIMIT
子句。
LIMIT
子句被 MySQL、H2、HSQLDB 等许多关系型数据库管理系统广泛使用。然而,LIMIT
并不是 SQL 标准的一部分。
为了符合 SQL 标准,PostgreSQL 支持 FETCH
子句:可以先跳过一定数量的行,然后再取回指定数量的行。
注意:FETCH
子句是在 SQL 标准的 SQL:2008 中引入的。
语法
OFFSET row_to_skip { ROW | ROWS }
FETCH { FIRST | NEXT } [ row_count ] { ROW | ROWS } ONLY
说明:
- 首先在
OFFSET
关键字后指定要跳过的行数row_to_skip
。它是一个大于或等于 0 的整数,默认值为 0(即不跳过任何行)。 - 如果
row_to_skip
大于表中的总行数,查询将返回 0 行。 - 其次在
FETCH
子句中提供要取回的行数row_count
。row_count
必须是大于或等于 1 的整数,默认值为 1。 ROW
是ROWS
的同义词,FIRST
是NEXT
的同义词,二者可以互换使用。- 由于表中行的物理存储顺序未定义,应始终配合
ORDER BY
使用FETCH
子句,以确保行的顺序一致。 - 在 SQL:2008 中,
OFFSET
必须位于FETCH
之前;但在 PostgreSQL 中,OFFSET
与FETCH
的先后顺序可以任意。 FETCH
在功能上等价于LIMIT
。如果希望应用更符合其他数据库系统的标准实现,建议使用遵循标准 SQL 的FETCH
子句。
示例
下面使用 sample database 中的 film
表进行演示。
以下查询使用 FETCH
子句,按标题升序选择第一条影片记录:
sql
SELECT
film_id,
title
FROM
film
ORDER BY
title
FETCH FIRST ROW ONLY;
输出:
film_id | title
---------+------------------
1 | Academy Dinosaur
(1 row)
这等价于:
sql
SELECT
film_id,
title
FROM
film
ORDER BY
title
FETCH FIRST 1 ROW ONLY;
以下查询使用 FETCH
子句,按标题升序选择前五条影片记录:
sql
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)
下面的语句在按标题升序的基础上,跳过前五条记录后再取回接下来的五条记录:
sql
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
子句,可以跳过一定数量的行并取回指定数量的行。您可与ORDER BY
搭配来确保结果顺序一致,必要时也可用OFFSET
来实现分页。