OFFSET / FETCH 절

OFFSET / FETCH 절

OFFSETFETCH는 데이터를 구간(portion) 단위로 가져올 수 있게 해줘요. 한 번의 쿼리로 가져오고 싶은 행 블록을 지정하는 데 사용해요. OFFSET은 결과에서 건너뛸 행 수를, FETCH는 쿼리 결과에 포함될 최대 행 수를 지정해요.

출처: 문서

본문

OFFSETFETCH는 데이터를 구간 단위로 가져올 수 있게 해줘요. 한 번의 쿼리로 얻고 싶은 행 블록을 지정해요.

-- SQL Standard style:
[OFFSET offset_row_count {ROW | ROWS}] [FETCH {FIRST | NEXT} fetch_row_count {ROW | ROWS} {ONLY | WITH TIES}]

-- MySQL/PostgreSQL style:
[LIMIT [n, ]m] [OFFSET offset_row_count]

SQL 표준의 OFFSET ... FETCH 형식은 LIMIT ... AFTER ... UNTIL 범위(range) 형식과 함께 조합할 수 없어요. offset_row_count 또는 fetch_row_count 값은 숫자나 리터럴 상수가 될 수 있어요. fetch_row_count는 생략할 수 있으며, 기본값은 1이에요. OFFSET은 쿼리 결과 집합에서 행을 반환하기 시작하기 전에 건너뛸 행 수를 지정해요. OFFSET n은 결과에서 처음 n개 행을 건너뛰어요. 음수 OFFSET도 지원돼요. OFFSET -n은 결과에서 마지막 n개 행을 건너뛰어요. 분수 OFFSET도 지원돼요. 0 < n < 1OFFSET n은 결과의 처음 n * 100%를 건너뛰게 돼요. 예:

  • OFFSET 0.1 — 결과의 처음 10%를 건너뛰어요.

Note (참고)

  • 분수는 1보다 작고 0보다 큰 Float64 숫자여야 해요.
  • 계산 결과로 분수 개수의 행이 나오면 다음 정수로 올림돼요.

FETCH는 쿼리 결과에 포함될 최대 행 수를 지정해요. ONLY 옵션은 OFFSET으로 생략된 행 바로 다음에 오는 행들을 반환할 때 사용해요. 이 경우 FETCHLIMIT 절의 대안이 돼요. 예를 들어 다음 쿼리는

SELECT * FROM test_fetch ORDER BY a OFFSET 1 ROW FETCH FIRST 3 ROWS ONLY;

다음 쿼리와 동일해요.

SELECT * FROM test_fetch ORDER BY a LIMIT 3 OFFSET 1;

WITH TIES 옵션은 ORDER BY 절에 따라 결과 집합의 마지막 순위와 동률(tie)을 이루는 추가 행을 반환할 때 사용해요. 예를 들어 fetch_row_count5로 설정되어 있는데 다섯 번째 행의 ORDER BY 열 값과 일치하는 행이 두 개 더 있다면, 결과 집합에는 일곱 개의 행이 포함돼요. 표준에 따르면 OFFSET 절과 FETCH 절이 함께 사용될 때는 OFFSET 절이 FETCH 절보다 먼저 와야 해요. 실제 오프셋은 offset 설정에 따라 달라질 수도 있어요.

Examples (예제)

입력 테이블:

┌─a─┬─b─┐
│ 1 │ 1 │
│ 2 │ 1 │
│ 3 │ 4 │
│ 1 │ 3 │
│ 5 │ 4 │
│ 0 │ 6 │
│ 5 │ 7 │
└───┴───┘

ONLY 옵션 사용:

Query (쿼리)

SELECT * FROM test_fetch ORDER BY a OFFSET 3 ROW FETCH FIRST 3 ROWS ONLY;

Response (응답)

┌─a─┬─b─┐
│ 2 │ 1 │
│ 3 │ 4 │
│ 5 │ 4 │
└───┴───┘

WITH TIES 옵션 사용:

Query (쿼리)

SELECT * FROM test_fetch ORDER BY a OFFSET 3 ROW FETCH FIRST 3 ROWS WITH TIES;

Response (응답)

┌─a─┬─b─┐
│ 2 │ 1 │
│ 3 │ 4 │
│ 5 │ 4 │
│ 5 │ 7 │
└───┴───┘

더 알아보기 (Learn more)