九月 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 子句来检索查询返回的部分行。