PostgreSQL(1) FETCH用法
摘要
在本教程中,您将学习如何使用 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
子句,按标题升序选择第一条影片记录:
SELECTfilm_id,title
FROMfilm
ORDER BYtitle
FETCH FIRST ROW ONLY;
输出:
film_id | title
---------+------------------1 | Academy Dinosaur
(1 row)
这等价于:
SELECTfilm_id,title
FROMfilm
ORDER BYtitle
FETCH FIRST 1 ROW ONLY;
以下查询使用 FETCH
子句,按标题升序选择前五条影片记录:
SELECTfilm_id,title
FROMfilm
ORDER BYtitle
FETCH FIRST 5 ROW ONLY;
输出:
film_id | title
---------+------------------1 | Academy Dinosaur2 | Ace Goldfinger3 | Adaptation Holes4 | Affair Prejudice5 | African Egg
(5 rows)
下面的语句在按标题升序的基础上,跳过前五条记录后再取回接下来的五条记录:
SELECTfilm_id,title
FROMfilm
ORDER BYtitle
OFFSET 5 ROWS
FETCH FIRST 5 ROW ONLY;
输出:
film_id | title
---------+------------------6 | Agent Truman7 | Airplane Sierra8 | Airport Pollock9 | Alabama Devil10 | Aladdin Calendar
(5 rows)
要点
- 使用 PostgreSQL 的
FETCH
子句,可以跳过一定数量的行并取回指定数量的行。您可与ORDER BY
搭配来确保结果顺序一致,必要时也可用OFFSET
来实现分页。