カテゴリ:

クエリ構文

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句の制限値の方が小さいため6行を期待するかもしれませんが、ORDER BY句がLIMIT句とは異なるサブクエリにあるため、結果は予測できず、クエリは6行より多いまたは少ない行数を返す可能性があります。

    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の使用例を示しています。

  • 行数に制限はありません。

  • 行1から開始します(行をスキップしません)。

    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 |
    +---+