> ## 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` 절은 쿼리 결과로 반환할 행 수를 제어합니다. 행은 개수와 오프셋으로 선택하거나, [`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을 사용한 선택:**

```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인 첫 행부터, 또는 `AFTER`가 생략된 경우 스트림의 시작부터, 해당 시작 지점 또는 그 이후에서 `end_expr`가 true인 첫 행 직전까지의 행을 반환합니다. `n`은 해당 범위의 길이를 제한합니다. `AFTER start_expr ALL`은 일치하는 모든 행에서 범위를 시작합니다. 아래 [LIMIT ... AFTER ... UNTIL](#limit-after-until)을 참조하세요.

## 음수 제한

음수 값을 사용해 결과 집합의 *끝*에서 행을 선택합니다.

| 구문 | 결과 |
| - | - |
| `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](/ko/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`](/ko/reference/statements/select/limit-by) 절이 범위보다 앞에 올 수 있으며, [`limit`](/ko/reference/settings/session-settings/other#limit) 설정은 여전히 결과 개수를 제한합니다.

## LIMIT ... WITH TIES

`WITH TIES` 수정자는 제한된 결과의 마지막 행과 `ORDER BY` 값이 동일한 추가 행도 포함합니다. 개수 및 오프셋 기반 제한에만 적용되며, [범위 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`도 포함됩니다.

`WITH TIES`는 음수 제한 및 오프셋과도 함께 작동합니다. 선택된 첫 번째 행과 `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`](/ko/reference/statements/select/order-by#order-by-expr-with-fill-modifier) 수정자와 함께 사용할 수 있습니다.

## LIMIT ... AFTER ... UNTIL (조건으로 범위 지정)

두 경계 조건 사이의 행 *범위*로 결과를 제한할 수 있습니다:

```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` 없이 사용하면 열린 단일 범위의 최대 길이가 됩니다. `AFTER ... ALL`과 함께 사용하면 열린 *각* 범위의 길이가 되므로 전체 결과가 `n`을 초과할 수 있습니다(예: `LIMIT 2 AFTER number IN (2, 6) ALL`은 최대 4개의 행을 반환할 수 있습니다). 결과 행의 총 개수를 제한하려면 `limit` 설정을 사용하십시오. 이 설정은 범위 처리 이후 전역 제한으로 적용됩니다.

스트림 순서(행을 읽는 순서)가 "첫 번째" 일치를 결정하므로, 이를 제어하려면 `ORDER BY`를 사용하십시오.

범위가 시작되기 전의 `UNTIL` 일치는 아무런 영향을 주지 않습니다. 두 조건이 모두 시작 행에서 일치하면 해당 범위는 비어 있습니다. 시작 지점 이후(시작 지점 포함)에 `UNTIL` 일치가 발생하지 않으면, 범위는 행 개수 `n`에 도달하거나 스트림 끝에 도달할 때까지 계속됩니다. `AFTER ... ALL`을 사용하면 앞선 범위가 종료된 뒤에 나오는 `AFTER` 일치가 새로운 범위를 열 수 있습니다.

`AFTER`를 `ALL` 없이 사용하는 경우, 범위 단계는 시작 일치가 포함된 청크를 찾을 때까지 `AFTER`를 평가합니다. 그 후 범위가 열려 있는 동안 해당 청크와 이후 청크에서 `UNTIL`을 평가합니다. 표현식은 청크 전체에 대해 평가되므로, 시작 청크 내에서는 시작 지점 이전의 행에 대해서도 `UNTIL`이 평가될 수 있습니다.

`UNTIL`에 `rowNumberInAllBlocks`와 같은 상태 유지형 함수나 쿼리 내에서 비결정적인 함수가 포함된 경우, 해당 함수들의 동작을 유지하기 위해 첫 번째 청크부터 평가됩니다. `ALL`이 없으면 `AFTER`는 시작 청크까지만 평가되며, 이후 청크에서는 `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`인 첫 번째 행 직전(해당 행 제외)까지의 행:

```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`이라는 identifier는 여전히 행 개수로 사용할 수 있습니다(`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`](/ko/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`](/ko/reference/statements/select/order-by) 절이 없으면 반환되는 행은 임의적일 수 있으며, 쿼리를 실행할 때마다 달라질 수 있습니다.

**서버 측 제한:** 반환되는 행 수는 [limit](/ko/reference/settings/session-settings/other#limit) 설정의 영향을 받을 수도 있습니다.

## 관련 항목

* [LIMIT BY](/ko/reference/statements/select/limit-by) — 값 그룹별 행 수를 제한하므로, 각 범주에서 상위 N개 결과를 가져올 때 유용합니다.
