LIMIT 절
LIMIT 절
LIMIT 절은 쿼리 결과에서 반환되는 행 수를 제어해요. 행을 개수와 오프셋으로 선택하거나, LIMIT ... AFTER ... UNTIL로 행의 범위를 여는 조건과 닫는 조건을 지정해 선택할 수 있어요.
출처: 문서
본문
LIMIT 절은 쿼리 결과에서 반환되는 행 수를 제어해요. 행은 개수와 오프셋으로 선택하거나, LIMIT ... AFTER ... UNTIL로 행 범위를 여는 조건과 닫는 조건으로 선택할 수 있어요.
Basic syntax (기본 구문)
첫 행 선택:
LIMIT m
결과에서 처음 m개 행을 반환하거나, 행이 m개보다 적으면 모든 레코드를 반환해요.
대체 TOP 구문 (MS SQL Server 호환):
-- 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 쿼리와의 호환성을 위해 사용할 수 있어요.
오프셋을 사용한 선택:
LIMIT m OFFSET n
-- or equivalently:
LIMIT n, m
처음 n개 행을 건너뛴 뒤 다음 m개 행을 반환해요. 두 형식 모두에서 n과 m은 음이 아닌 정수여야 해요.
조건으로 범위 선택:
LIMIT [n] AFTER start_expr [UNTIL end_expr]
LIMIT [n] UNTIL end_expr
start_expr이 참인 첫 행부터, AFTER가 생략되면 스트림의 시작부터, end_expr이 참인 행(해당 행 제외)까지의 행을 반환해요. n은 해당 범위의 길이를 제한해요. AFTER start_expr ALL은 일치하는 모든 행에서 범위를 열어요. 아래 LIMIT … AFTER … UNTIL을 참고해요.
Negative limits (음수 limit)
음수 값을 사용해 결과 집합의 끝에서 행을 선택해요.
| Syntax | Result (결과) |
|---|---|
| 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과 동등해요.
Fractional limits (분수 limit)
0과 1 사이의 십진 값을 사용해 행의 백분율을 선택해요.
| Syntax | Result (결과) |
|---|---|
| LIMIT 0.1 | 처음 10%의 행 |
| LIMIT 1 OFFSET 0.5 | 중앙값 행 |
| LIMIT 0.25 OFFSET 0.5 | 제3사분위수 (처음 50%를 건너뛴 뒤 행의 25%) |
- 분수는 0보다 크고 1보다 작은 Float64 값이어야 해요.
- 분수 행 수는 다음 정수로 올림돼요.
Combining limit types (limit 유형 결합)
표준 정수를 분수 또는 음수 오프셋과 혼합할 수 있어요.
LIMIT 10 OFFSET 0.5 -- 10 rows starting from the halfway point
LIMIT 10 OFFSET -20 -- 10 rows after skipping the last 20
범위 형식은 일반 행 개수와만 결합돼요. LIMIT 3 AFTER start_expr은 범위가 열리는 지점에서 최대 3개 행을 가져와요. OFFSET, 분수 및 음수 개수, WITH TIES는 AFTER 또는 UNTIL과 함께 사용되면 거부돼요. 같은 쿼리에서 범위 앞에 LIMIT BY 절이 올 수 있고, limit 설정이 여전히 결과를 제한해요.
LIMIT … WITH TIES
WITH TIES 수정자는 limit의 마지막 행과 같은 ORDER BY 값을 가진 추가 행을 포함해요. 개수와 오프셋 limit에만 적용되며 범위 형식과는 결합할 수 없어요.
SELECT * FROM (
SELECT number % 50 AS n FROM numbers(100)
) ORDER BY n LIMIT 0, 5
┌─n─┐
│ 0 │
│ 0 │
│ 1 │
│ 1 │
│ 2 │
└───┘
WITH TIES를 사용하면 마지막 값과 일치하는 모든 행이 포함돼요.
SELECT * FROM (
SELECT number % 50 AS n FROM numbers(100)
) ORDER BY n LIMIT 0, 5 WITH TIES
┌─n─┐
│ 0 │
│ 0 │
│ 1 │
│ 1 │
│ 2 │
│ 2 │
└───┘
행 6은 행 5와 같은 값(2)을 가지므로 포함돼요. OFFSET 키워드로 오프셋을 지정한 경우에도 동일하게 적용돼요.
SELECT * FROM (
SELECT number % 50 AS n FROM numbers(100)
) ORDER BY n LIMIT 3 OFFSET 2 WITH TIES
┌─n─┐
│ 1 │
│ 1 │
│ 2 │
│ 2 │
└───┘
처음 2개 행을 건너뛰고 3개를 가져오면 보통 1, 1, 2를 반환하지만, 두 번째 2는 마지막 행과 동률(tie)이므로 포함돼요. WITH TIES는 음수 limit과 offset에서도 동작해요. 첫 번째로 선택된 행과 같은 ORDER BY 값을 가진 추가 행을 포함해요.
SELECT number % 3 AS n FROM numbers(15)
ORDER BY n LIMIT -4 OFFSET -3 WITH TIES
┌─n─┐
│ 1 │
│ 1 │
│ 1 │
│ 1 │
│ 1 │
│ 2 │
│ 2 │
└───┘
WITH TIES가 없으면 결과는 1, 1, 2, 2가 돼요. WITH TIES를 사용하면 첫 번째로 선택된 행과 동률인 값 1을 가진 추가 행 3개가 포함돼요. 이 수정자는 ORDER BY ... WITH FILL 수정자와 결합할 수 있어요.
LIMIT … AFTER … UNTIL (조건으로 범위 제한)
두 경계 조건 사이의 행 범위로 결과를 제한할 수 있어요.
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이 참인 첫 행부터 출력을 시작해요(그 행 포함).AFTER start_expr ALL:start_expr이 참인 지점에서 시작하는 모든 일치 범위의 합집합을 출력하되, 범위가 겹칠 때 행을 중복하지 않아요.UNTIL end_expr: 각 범위를 시작 지점 이후에서end_expr이 참인 첫 행 앞에서 끝내요(그 행 제외).n: 선택적 행 개수.ALL이 없으면 단일 열린 범위의 최대 길이예요.AFTER ... ALL이 있으면 각 열린 범위의 길이가 되어 총 결과가n을 초과할 수 있어요(예:LIMIT 2 AFTER number IN (2, 6) ALL은 최대 4개 행을 반환할 수 있어요). 총 결과 행 수를 제한하려면 범위 뒤에 전역 limit으로 적용되는limit설정을 사용해요.
스트림 순서(행이 읽히는 순서)가 “첫 번째” 일치를 정의해요. 제어하려면 ORDER BY를 사용해요. 범위가 시작되기 전의 UNTIL 일치는 효과가 없어요. 두 조건이 시작 행에서 모두 일치하면 범위는 비어요. 시작 지점 이후(또는 시작 지점)에서 UNTIL 일치가 없으면 범위는 행 개수 n 또는 스트림 끝까지 계속돼요. AFTER ... ALL에서는 이후의 AFTER 일치가 이전 범위가 끝난 후 새 범위를 열 수 있어요. AFTER와 ALL 없이, 범위 단계는 시작 일치를 포함한 청크를 찾을 때까지 AFTER를 평가해요. 그런 다음 그 청크와 이후 청크에서 범위가 열려 있는 동안 UNTIL을 평가해요. 표현식은 전체 청크에 대해 평가되므로, UNTIL은 시작 청크 내에서 시작 전의 행에 대해서도 평가될 수 있어요. UNTIL에 rowNumberInAllBlocks 같은 상태 저장 함수나 쿼리 내에서 비결정적인 함수가 포함되면, 그 함수들의 동작을 보존하기 위해 첫 청크부터 평가돼요. ALL이 없으면 AFTER는 시작 청크까지만 평가되고, 이후 청크에서는 UNTIL만 평가돼요. 시작 전의 종료 일치는 여전히 효과가 없어요.
Examples (예제):
number >= 3인 첫 행부터 처음 3개 행:
SELECT number FROM numbers(10) ORDER BY number LIMIT 3 AFTER number >= 3;
┌─number─┐
│ 3 │
│ 4 │
│ 5 │
└────────┘
number >= 2인 첫 행부터 number >= 6인 첫 행 앞(제외)까지:
SELECT number FROM numbers(10) ORDER BY number LIMIT 10 AFTER number >= 2 UNTIL number >= 6;
┌─number─┐
│ 2 │
│ 3 │
│ 4 │
│ 5 │
└────────┘
n이 없으면 AFTER 일치부터 스트림 끝까지(또는 UNTIL까지) 모든 행이 반환돼요.
SELECT number FROM numbers(10) ORDER BY number LIMIT AFTER number >= 7;
┌─number─┐
│ 7 │
│ 8 │
│ 9 │
└────────┘
n 없이 UNTIL을 사용하면 범위는 첫 AFTER 일치부터 그 이후의 첫 UNTIL 일치까지 실행돼요.
SELECT number FROM numbers(10) ORDER BY number LIMIT AFTER number >= 2 UNTIL number >= 6;
┌─number─┐
│ 2 │
│ 3 │
│ 4 │
│ 5 │
└────────┘
시작 전의 UNTIL 일치는 무시돼요. 여기서 number = 1은 효과가 없고 범위는 number = 6 앞에서 끝나요.
SELECT number FROM numbers(10) ORDER BY number LIMIT AFTER number = 3 UNTIL number IN (1, 6);
┌─number─┐
│ 3 │
│ 4 │
│ 5 │
└────────┘
겹침을 중복하지 않고 각 일치 행 뒤에 2개 행을 출력:
SELECT number FROM numbers(10) ORDER BY number LIMIT 2 AFTER number IN (2, 3, 6) ALL;
┌─number─┐
│ 2 │
│ 3 │
│ 4 │
│ 6 │
│ 7 │
└────────┘
ALL과 UNTIL이 함께 있으면 각 열린 범위는 그 n개 행 또는 다음 UNTIL 일치 중 먼저 오는 것에서 끝나요. 여기서 6에서 열린 범위는 number = 7에 의해 잘려요.
SELECT number FROM numbers(10) ORDER BY number LIMIT 2 AFTER number IN (2, 6) ALL UNTIL number = 7;
┌─number─┐
│ 2 │
│ 3 │
│ 6 │
└────────┘
n이 없으면 UNTIL 일치가 현재 범위를 닫고, 이후 AFTER 일치가 새 범위를 열며, 더 이상 UNTIL 일치가 없으면 끝까지 실행돼요.
SELECT number FROM numbers(10) ORDER BY number LIMIT AFTER number IN (2, 6) ALL UNTIL number = 4;
┌─number─┐
│ 2 │
│ 3 │
│ 6 │
│ 7 │
│ 8 │
│ 9 │
└────────┘
n과 UNTIL이 없으면 각 열린 범위는 스트림 끝까지 실행되므로, AFTER start_expr ALL은 AFTER start_expr과 같은 행을 반환해요.
WITH TIES, 분수/음수LIMIT/OFFSET,OFFSET은AFTER/UNTIL과 함께 지원되지 않아요.AFTER/UNTIL을 사용할 때는 예비LIMITpushdown이 비활성화돼요.AFTER와UNTIL은 뒤에 경계 표현식이 올 때만 키워드로 인식되므로,after나until이라는 이름의 식별자는 여전히 행 개수로 동작해요(LIMIT after,LIMIT after BY x). 두 해석이 모두 가능할 때는 키워드가 우선해요.LIMIT after(2)는 범위LIMIT AFTER (2)이고,after라는 함수를 호출하려면LIMIT (after(2))로 쓰세요.
UNTIL 단독 사용은 스트림 시작부터 조건이 참인 첫 행까지의 행을 반환해요.
SELECT number FROM numbers(10) ORDER BY number LIMIT UNTIL number >= 3;
┌─number─┐
│ 0 │
│ 1 │
│ 2 │
└────────┘
n이 있으면 UNTIL 단독 사용은 스트림 시작부터 최대 n개 행을 반환하며, 여전히 첫 일치에서 멈춰요.
SELECT number FROM numbers(10) ORDER BY number LIMIT 2 UNTIL number >= 3;
┌─number─┐
│ 0 │
│ 1 │
└────────┘
LIMIT BY 뒤에 범위가 올 수 있으며, LIMIT BY가 유지한 행에 적용돼요.
SELECT number % 4 AS k, number FROM numbers(12) ORDER BY k, number LIMIT 2 BY k LIMIT 3 AFTER k >= 1;
┌─k─┬─number─┐
│ 1 │ 1 │
│ 1 │ 5 │
│ 2 │ 2 │
└───┴────────┘
Considerations (고려 사항)
비결정적 결과: ORDER BY 절이 없으면 반환되는 행이 임의적일 수 있고 쿼리 실행 사이에 달라질 수 있어요. 서버 측 limit: 반환되는 행 수는 limit 설정의 영향을 받을 수도 있어요.
See also (참고)
- LIMIT BY — 각 값 그룹별로 행 수를 제한하며, 각 범주 내 상위 N개 결과를 얻는 데 유용해요.