> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-parallel-read-in-order-multi-part.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> LIMIT 句の説明

# LIMIT

`LIMIT` 句は、クエリ結果として返される行数を制御します。行は件数と OFFSET で選択するか、[`LIMIT ... AFTER ... UNTIL`](#limit-after-until) で行の範囲の開始と終了を指定する条件によって選択できます。

## 基本構文

**先頭の行を取得:**

```sql theme={null}
LIMIT m
```

結果の先頭 `m` 行を返します。結果が `m` 行未満の場合は、すべてのレコードを返します。

**TOP の代替構文 (MS SQL Server 互換) :**

```sql theme={null}
-- SELECT TOP number|percent column_name(s) FROM table_name
SELECT TOP 10 * FROM numbers(100);
SELECT TOP 0.1 * FROM numbers(100);
```

これは `LIMIT m` と同等で、Microsoft SQL Server のクエリとの互換性のために使用できます。

**OFFSET を指定した SELECT:**

```sql theme={null}
LIMIT m OFFSET n
-- or equivalently:
LIMIT n, m
```

先頭の`n`行をスキップし、その次の`m`行を返します。

どちらの形式でも、`n`と`m`は 0 以上の整数である必要があります。

**条件による範囲の取得:**

```sql theme={null}
LIMIT [n] AFTER start_expr [UNTIL end_expr]
LIMIT [n] UNTIL end_expr
```

`start_expr` が true となる最初の行から、その開始位置以降で `end_expr` が true となる最初の行の直前までの行を返します。`AFTER` を省略した場合は、ストリームの先頭から開始します。`n` はその範囲の長さの上限を指定します。`AFTER start_expr ALL` は、一致するすべての行で範囲を開始します。以下の [LIMIT ... AFTER ... UNTIL](#limit-after-until) を参照してください。

## 負の LIMIT

負の値を使用すると、result set の*末尾*から行を選択できます。

| 構文 | 結果 |
| - | - |
| `LIMIT -m` | 末尾の `m` 行 |
| `LIMIT -m OFFSET -n` | 末尾の `n` 行をスキップしたあとの末尾の `m` 行 |
| `LIMIT m OFFSET -n` | 末尾の `n` 行をスキップしたあとの先頭の `m` 行 |
| `LIMIT -m OFFSET n` | 先頭の `n` 行をスキップしたあとの末尾の `m` 行 |

`LIMIT -n, -m` 構文は `LIMIT -m OFFSET -n` と同等です。

## 小数指定の制限

0 から 1 の間の小数値を使用して、行の割合を指定できます。

| 構文 | 結果 |
| - | - |
| `LIMIT 0.1` | 先頭の 10% の行 |
| `LIMIT 1 OFFSET 0.5` | 中央の行 |
| `LIMIT 0.25 OFFSET 0.5` | 第3四分位数 (先頭の 50% をスキップした後の 25% の行) |

<Note>
  * 小数は、0 より大きく 1 より小さい [Float64](/ja/reference/data-types/float) 値である必要があります。
  * 小数で指定した行数は、次の整数に切り上げられます。
</Note>

## LIMIT の種類を組み合わせる

通常の整数と、小数または負の OFFSET を組み合わせて使用できます。

```sql theme={null}
LIMIT 10 OFFSET 0.5    -- 10 rows starting from the halfway point
LIMIT 10 OFFSET -20    -- 10 rows after skipping the last 20
```

[範囲 form](#limit-after-until) は、通常の行数とのみ組み合わせられます。`LIMIT 3 AFTER start_expr` は、範囲の開始位置から最大3行を取得します。`OFFSET`、小数および負の件数、`WITH TIES` は、`AFTER` または `UNTIL` と併用できません。[`LIMIT BY`](/ja/reference/statements/select/limit-by) 句は同じクエリ内で範囲の前に指定でき、[`limit`](/ja/reference/settings/session-settings/other#limit) 設定は引き続き結果の上限を設定します。

## LIMIT ... WITH TIES

`WITH TIES` 修飾子は、制限された最後の行と同じ `ORDER BY` 値を持つ追加の行も含めます。これは count および OFFSET による limit にのみ適用され、[範囲 form](#limit-after-until) と組み合わせて使用することはできません。

```sql theme={null}
SELECT * FROM (
    SELECT number % 50 AS n FROM numbers(100)
) ORDER BY n LIMIT 0, 5
```

```response theme={null}
┌─n─┐
│ 0 │
│ 0 │
│ 1 │
│ 1 │
│ 2 │
└───┘
```

`WITH TIES` を使用すると、最後の値と一致するすべての行が含まれます。

```sql theme={null}
SELECT * FROM (
    SELECT number % 50 AS n FROM numbers(100)
) ORDER BY n LIMIT 0, 5 WITH TIES
```

```response theme={null}
┌─n─┐
│ 0 │
│ 0 │
│ 1 │
│ 1 │
│ 2 │
│ 2 │
└───┘
```

6 行目は、5 行目と同じ値 (`2`) であるため含まれます。

OFFSET を `OFFSET` キーワードで指定した場合も同様です。

```sql theme={null}
SELECT * FROM (
    SELECT number % 50 AS n FROM numbers(100)
) ORDER BY n LIMIT 3 OFFSET 2 WITH TIES
```

```response theme={null}
┌─n─┐
│ 1 │
│ 1 │
│ 2 │
│ 2 │
└───┘
```

最初の2行をスキップして3行を取得すると、通常は `1, 1, 2` が返されますが、2つ目の `2` も最後の行と同順位のため含まれます。

`WITH TIES` は負の limit と OFFSET でも機能します。最初に選択された行と同じ `ORDER BY` 値を持つ追加の行も含めます。

```sql theme={null}
SELECT number % 3 AS n FROM numbers(15)
ORDER BY n LIMIT -4 OFFSET -3 WITH TIES
```

```response theme={null}
┌─n─┐
│ 1 │
│ 1 │
│ 1 │
│ 1 │
│ 1 │
│ 2 │
│ 2 │
└───┘
```

`WITH TIES` がない場合、結果は `1, 1, 2, 2` になります。`WITH TIES` を使用すると、最初に選択された行と同順位であるため、値 `1` の行がさらに 3 行含まれます。

この修飾子は、[`ORDER BY ... WITH FILL`](/ja/reference/statements/select/order-by#order-by-expr-with-fill-modifier) 修飾子と組み合わせて使用できます。

## LIMIT ... AFTER ... UNTIL (conditions による範囲指定)

2 つの boundary condition に挟まれた行の *範囲* に結果を絞り込むことができます:

```sql theme={null}
LIMIT [n] AFTER start_expr [UNTIL end_expr]
LIMIT [n] AFTER start_expr ALL [UNTIL end_expr]
LIMIT [n] UNTIL end_expr
```

* `AFTER start_expr`: `start_expr` が true となる最初の行から出力を開始します (その行を含む) 。
* `AFTER start_expr ALL`: `start_expr` が true となる位置から始まる、すべての一致範囲のユニオンを出力します。範囲が重複しても、行は重複しません。
* `UNTIL end_expr`: 各範囲は、その開始位置以降で `end_expr` が true となる最初の行の直前で終了します (その行は含まれません) 。
* `n`: 任意の行数。`ALL` を指定しない場合、1 つの開始済み範囲の最大長です。`AFTER ... ALL` を指定した場合は、開始された*各*範囲の長さとなるため、結果の合計は `n` を超えることがあります (たとえば、`LIMIT 2 AFTER number IN (2, 6) ALL` は最大 4 行を返すことがあります) 。結果行の合計数を制限するには、範囲の後にグローバル制限として適用される `limit` 設定を使用します。

ストリーム順序 (行を読み取る順序) によって「最初」の一致が決まります。これを制御するには `ORDER BY` を使用します。

範囲が開始される前の `UNTIL` の一致は影響しません。開始行で両方の条件が一致する場合、その範囲は空になります。開始位置以降に `UNTIL` の一致がない場合、範囲は行数 `n` に達するまで、またはストリームの終端まで続きます。`AFTER ... ALL` を指定した場合、先行する範囲が終了した後、後続の `AFTER` 一致によって新しい範囲を開始できます。

`AFTER` を指定し `ALL` を指定しない場合、範囲ステップは開始一致を含む chunk が見つかるまで `AFTER` を評価します。その後、その chunk および以降の chunk で、範囲が開いている間 `UNTIL` を評価します。式は chunk 全体に対して評価されるため、開始した chunk 内では開始位置より前の行についても `UNTIL` が評価されることがあります。

`UNTIL` に `rowNumberInAllBlocks` のような stateful function や、クエリ内で非決定論的な関数が含まれる場合、それらの関数の動作を保つために最初の chunk から評価されます。`ALL` を指定しない場合、`AFTER` は開始した chunk までしか評価されず、以降の chunk では `UNTIL` のみが評価されます。開始位置より前の終了一致は、やはり影響しません。

**例:**

`number >= 3` となる最初の行から始まる最初の 3 行:

```sql theme={null}
SELECT number FROM numbers(10) ORDER BY number LIMIT 3 AFTER number >= 3;
```

```response theme={null}
┌─number─┐
│      3 │
│      4 │
│      5 │
└────────┘
```

`number >= 2` となる最初の行から、`number >= 6` となる最初の行 (exclusive) までの行:

```sql theme={null}
SELECT number FROM numbers(10) ORDER BY number LIMIT 10 AFTER number >= 2 UNTIL number >= 6;
```

```response theme={null}
┌─number─┐
│      2 │
│      3 │
│      4 │
│      5 │
└────────┘
```

`n` を指定しない場合、`AFTER` に一致した位置からストリームの終端まで (または `UNTIL` まで) のすべての行が返されます:

```sql theme={null}
SELECT number FROM numbers(10) ORDER BY number LIMIT AFTER number >= 7;
```

```response theme={null}
┌─number─┐
│      7 │
│      8 │
│      9 │
└────────┘
```

`n` を指定せず `UNTIL` のみを指定した場合、範囲は最初に `AFTER` に一致した箇所から、その位置以降で最初に `UNTIL` に一致した箇所までとなります:

```sql theme={null}
SELECT number FROM numbers(10) ORDER BY number LIMIT AFTER number >= 2 UNTIL number >= 6;
```

```response theme={null}
┌─number─┐
│      2 │
│      3 │
│      4 │
│      5 │
└────────┘
```

開始位置より前の `UNTIL` 一致は無視されます。ここでは `number = 1` は影響せず、範囲は `number = 6` の直前で終了します:

```sql theme={null}
SELECT number FROM numbers(10) ORDER BY number LIMIT AFTER number = 3 UNTIL number IN (1, 6);
```

```response theme={null}
┌─number─┐
│      3 │
│      4 │
│      5 │
└────────┘
```

一致した各行の後に2行を出力し、重複部分は重複して出力しません:

```sql theme={null}
SELECT number FROM numbers(10) ORDER BY number LIMIT 2 AFTER number IN (2, 3, 6) ALL;
```

```response theme={null}
┌─number─┐
│      2 │
│      3 │
│      4 │
│      6 │
│      7 │
└────────┘
```

`ALL` と `UNTIL` を併用した場合、開いた各範囲は `n` 行に達した時点、または次に `UNTIL` に一致した時点のいずれか早い方で終了します。ここでは 6 で開いた範囲が `number = 7` によって打ち切られます:

```sql theme={null}
SELECT number FROM numbers(10) ORDER BY number LIMIT 2 AFTER number IN (2, 6) ALL UNTIL number = 7;
```

```response theme={null}
┌─number─┐
│      2 │
│      3 │
│      6 │
└────────┘
```

`n` を指定しない場合、`UNTIL` の一致により現在の範囲が閉じられ、その後の `AFTER` の一致によって新しい範囲が開かれます。以降に `UNTIL` の一致がなければ、その範囲は終端まで続きます:

```sql theme={null}
SELECT number FROM numbers(10) ORDER BY number LIMIT AFTER number IN (2, 6) ALL UNTIL number = 4;
```

```response theme={null}
┌─number─┐
│      2 │
│      3 │
│      6 │
│      7 │
│      8 │
│      9 │
└────────┘
```

`n` も `UNTIL` も指定しない場合、開いた各範囲はストリームの終端まで続くため、`AFTER start_expr ALL` は `AFTER start_expr` と同じ行を返します。

<Note>
  * `WITH TIES`、小数または負数の `LIMIT`/`OFFSET`、および `OFFSET` は、`AFTER`/`UNTIL` と併用できません。
  * `AFTER`/`UNTIL` を使用すると、予備的な `LIMIT` pushdown は無効になります。
  * `AFTER` と `UNTIL` は、その後に境界式が続く場合にのみキーワードとして認識されます。そのため、`after` または `until` という名前の識別子も行数として使用できます (`LIMIT after`、`LIMIT after BY x`) 。両方に解釈できる場合はキーワードが優先されます。`LIMIT after(2)` は範囲指定の `LIMIT AFTER (2)` として解釈されます。`after` という名前の関数を呼び出すには、`LIMIT (after(2))` と記述します。
</Note>

`UNTIL` のみを指定した場合、ストリームの先頭から条件が true となる最初の行までの行を返します。

```sql theme={null}
SELECT number FROM numbers(10) ORDER BY number LIMIT UNTIL number >= 3;
```

```response theme={null}
┌─number─┐
│      0 │
│      1 │
│      2 │
└────────┘
```

`n` を指定した場合、`UNTIL` のみでもストリームの先頭から最大 `n` 行が返され、最初に一致した時点で停止する動作は変わりません:

```sql theme={null}
SELECT number FROM numbers(10) ORDER BY number LIMIT 2 UNTIL number >= 3;
```

```response theme={null}
┌─number─┐
│      0 │
│      1 │
└────────┘
```

範囲は [`LIMIT BY`](/ja/reference/statements/select/limit-by) の後に指定でき、その場合は `LIMIT BY` によって残された行に適用されます:

```sql theme={null}
SELECT number % 4 AS k, number FROM numbers(12) ORDER BY k, number LIMIT 2 BY k LIMIT 3 AFTER k >= 1;
```

```response theme={null}
┌─k─┬─number─┐
│ 1 │      1 │
│ 1 │      5 │
│ 2 │      2 │
└───┴────────┘
```

## 注意事項

**非決定論的な結果:** [`ORDER BY`](/ja/reference/statements/select/order-by) 句がない場合、返される行は不定であり、クエリを実行するたびに異なる可能性があります。

**サーバー側の制限:** 返される行数は、[limit](/ja/reference/settings/session-settings/other#limit) 設定の影響を受ける場合もあります。

## 関連項目

* [LIMIT BY](/ja/reference/statements/select/limit-by) — 値の各グループごとに行数を制限します。各カテゴリ内の上位 N 件の結果を取得する場合に便利です。
