类别:

查询语法

LIMIT / FETCH

约束语句或子查询返回的最大行数。LIMIT(PostgreSQL 语法)和 FETCH(ANSI 语法)均受支持,并产生相同的结果。

另请参阅:

TOP <n>

语法

PostgreSQL 语法

SELECT ...
FROM ...
[ ORDER BY ... ]
LIMIT <count> [ OFFSET <start> ]
[ ... ]

ANSI 语法

SELECT ...
FROM ...
[ ORDER BY ... ]
[ OFFSET <start> ] [ { ROW | ROWS } ] FETCH [ { FIRST | NEXT } ] <count> [ { ROW | ROWS } ] [ ONLY ]
[ ... ]

参数

count

返回的行数。必须是非负整数常量。

也接受值 NULL、空字符串 ('') 和 $$$$ 并将其视为“无限制”;如果连接器和驱动程序(如 JDBC 驱动程序)在将参数动态绑定到语句时收到不完整的参数列表,这主要对它们有用。

OFFSET start

在此之后返回受限/提取的行的行编号。必须是非负整数常量。

如果 OFFSET 省略,则输出从结果集中的第一行开始。

也接受值 NULL、空字符串 ('') 和 $$$$ 并将其视为 0(即不跳过任何行);如果连接器和驱动程序(如 JDBC 驱动程序)在将参数动态绑定到语句时收到不完整的参数列表,这主要对它们有用。

ONLY

此可选关键字不会影响输出。它只是用于向人类读者强调。

使用说明

  • ORDER BY 子句并非必需;但如果没有 ORDER BY 子句,结果是不确定的,因为查询结果不一定按任何特定顺序排列。要控制返回的结果,请使用 ORDER BY 子句。

  • 子查询中的 ORDER BY 子句仅保证该子查询内的排序。外部查询级别中不保留顺序。当 LIMIT 子句依赖于来自不同的嵌套级别 ORDER BY 子句,优化器可能不会按预期应用 LIMIT 子句,并且返回的行数可能与 LIMIT 值不同。同一子查询的 COUNT(*) 查询也可能报告与实际返回的行数不同的行数。

    例如,在以下查询中,最内层子查询对结果进行排序,中间子查询将输出限制为 6 行,外部查询将输出限制为 100 行。您可能期望六行,因为内部 LIMIT 子句较小,但由于 ORDER BY 子句位于与 LIMIT 子句不同的子查询中,结果不可预测,查询可能返回多于或少于六行:

    SELECT *
      FROM (
            SELECT *
              FROM (
                     SELECT *
                       FROM my_table
                       ORDER BY col1  -- Ordering: innermost level
                   )
              LIMIT 6                 -- LIMIT: middle level
           )
      LIMIT 100;                      -- LIMIT: outermost level
    

    为避免出现不可预测的结果,请保留位于同一查询级别的 ORDER BY 子句和 LIMIT(或 FETCH)子句:

    SELECT *
      FROM my_table
      ORDER BY col1
      LIMIT 6;
    
  • Top-K 修剪可以提高同时包含 LIMIT 和 ORDER BY 子句的查询的性能。有关更多信息,请参阅 用于提高查询性能的 Top-K 修剪

  • TOP n 和 LIMIT count 是等效的。

  • LIMIT 子句和 SAMPLE 子句都会返回表中行的子集。使用 LIMIT 子句时,Snowflake 会以尽可能最快的方式返回指定行数。使用 SAMPLE 子句时,Snowflake 会根据子句中指定的采样方法返回行。

示例

以下示例演示了 LIMIT 的效果。为了简单起见,这些查询省略了 ORDER BY 子句,并假设输出顺序始终与第一个查询所示的顺序相同。** 实际查询应该包含 ORDER BY。**

SELECT c1 FROM testtable;
+------+
|   C1 |
|------|
|    1 |
|    2 |
|    3 |
|   20 |
|   19 |
|   18 |
|    1 |
|    2 |
|    3 |
|    4 |
| NULL |
|   30 |
| NULL |
+------+
SELECT c1 FROM testtable LIMIT 3 OFFSET 3;
+----+
| C1 |
|----|
| 20 |
| 19 |
| 18 |
+----+
SELECT c1 FROM testtable ORDER BY c1;
+------+
|   C1 |
|------|
|    1 |
|    1 |
|    2 |
|    2 |
|    3 |
|    3 |
|    4 |
|   18 |
|   19 |
|   20 |
|   30 |
| NULL |
| NULL |
+------+
SELECT c1 FROM testtable ORDER BY c1 LIMIT 3 OFFSET 3;
+----+
| ID |
|----|
|  2 |
|  3 |
|  3 |
+----+

下面的示例演示如何使用 NULLs 来指示:

  • 行数没有限制。

  • 从第一行开始(不要跳过任何行)。

    CREATE TABLE demo1 (i INTEGER);
    INSERT INTO demo1 (i) VALUES (1), (2);
    
    SELECT * FROM demo1 ORDER BY i LIMIT NULL OFFSET NULL;
    
    +---+
    | I |
    |---|
    | 1 |
    | 2 |
    +---+
    
    SELECT * FROM demo1 ORDER BY i LIMIT '' OFFSET '';
    
    +---+
    | I |
    |---|
    | 1 |
    | 2 |
    +---+
    
    SELECT * FROM demo1 ORDER BY i LIMIT $$$$ OFFSET $$$$;
    
    +---+
    | I |
    |---|
    | 1 |
    | 2 |
    +---+