어제는 LIMIT으로 결과 개수를 제한했습니다. 오늘은 앞의 행을 건너뛰는 OFFSET을 함께 써보겠습니다. 상품을 가격순으로 2개씩 보여줄 때 두 번째 묶음을 가져오는 예제입니다.
예제 데이터
아래 예제는 PostgreSQL 기준입니다. WITH와 VALUES로 쿼리 안에 데이터를 만들므로 그대로 실행할 수 있습니다.
| product_id | product_name | price |
| 1 | 노트 | 3000 |
| 2 | 펜 | 1000 |
| 3 | 지우개 | 1000 |
| 4 | 가방 | 20000 |
| 5 | 파일 | 5000 |
오늘의 쿼리
WITH products (product_id, product_name, price) AS (
VALUES
(1, '노트', 3000),
(2, '펜', 1000),
(3, '지우개', 1000),
(4, '가방', 20000),
(5, '파일', 5000)
)
SELECT product_id, product_name, price
FROM products
ORDER BY price ASC, product_id ASC
LIMIT 2 OFFSET 2;
ORDER BY로 가격순으로 정렬한 뒤 OFFSET 2가 앞의 2행을 건너뜁니다. 그다음 LIMIT 2가 최대 2행을 가져옵니다. 첫 번째 묶음은 OFFSET 0, 두 번째 묶음은 OFFSET 2입니다.
예상 결과
정렬 순서는 펜 → 지우개 → 노트 → 파일 → 가방입니다. 앞의 두 상품을 건너뛰면 다음 두 상품이 나옵니다.
| product_id | product_name | price |
| 1 | 노트 | 3000 |
| 5 | 파일 | 5000 |
실무에서 주의할 점
OFFSET은 페이지 번호가 아니라 건너뛸 행의 개수입니다. ORDER BY 없이 페이지를 나누면 결과 순서를 보장할 수 없습니다. 가격이 같은 상품도 있으므로 고유한 product_id까지 정렬해 순서를 안정적으로 만드세요. 또한 큰 OFFSET은 건너뛸 행도 계산해야 하므로 비효율적일 수 있습니다.
참고: PostgreSQL 공식 문서 — LIMIT과 OFFSET
다음 글에서는 필요한 값만 중복 없이 보는 DISTINCT를 살펴보겠습니다.
반응형
'SQL 기초' 카테고리의 다른 글
| 오늘의 쿼리 07 | AS로 결과 열 이름 바꾸기 (0) | 2026.10.30 |
|---|---|
| 오늘의 쿼리 06 | DISTINCT로 중복 값 없이 조회하기 (0) | 2026.10.29 |
| 오늘의 쿼리 04 | LIMIT으로 결과 개수 제한하기 (0) | 2026.10.27 |
| 오늘의 쿼리 03 | ORDER BY로 조회 결과 정렬하기 (0) | 2026.10.26 |
| 오늘의 쿼리 02 | WHERE로 원하는 행만 골라보기 (0) | 2026.10.25 |