PostgreSQL 教程: FETCH NEXT n ROWS ONLY OFFSET m ROWS

九月 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

在这个语法中:

  • ROWROWS的同义词,FIRSTNEXT的同义词。所以你可以互换使用它们。
  • start是一个整数,必须为零或正数。默认情况下,如果未指定OFFSET子句,则该值为零。如果start大于结果集中的行数,则不返回任何行;
  • row_count是 1 或更大。默认情况下,如果不显式指定row_count,则默认值为 1。

由于表中存储的行顺序是未指定的,因此在使用FETCH子句时应始终带有ORDER BY子句,以使返回的结果集中的行顺序一致。

请注意,在 SQL:2008 标准中,OFFSET子句必须位于FETCH子句之前。但是,OFFSETFETCH子句可以以任何顺序出现在 PostgreSQL 中。

FETCH 对比 LIMIT

FETCH子句在功能上等同于LIMIT子句。如果您计划使您的应用程序与其他数据库系统兼容,则应该使用FETCH子句,因为它遵循 SQL 标准。

PostgreSQL FETCH 示例

我们使用示例数据库中的film表进行演示。

Film Table

以下语句使用 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 子句来检索查询返回的部分行。