본문 바로가기
C.W.K.
Stream
Lesson 03 of 16 · published

ORDER BY, LIMIT, 페이지 나누기

~12 min · queries, ordering

Level 0스키마 새싹
0 XP0/86 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

순서는 요청해야 생겨

정렬을 명시하지 않은 결과에는 보장된 순서가 없어. ORDER BY price DESC처럼 기준과 방향을 적고, 동점이 가능하면 두 번째 기준까지 둬. ORDER BY category, price DESC는 범주 안에서 높은 가격부터 정렬해. NULL의 위치는 NULLS FIRSTNULLS LAST로 정할 수 있어.

필요한 만큼만 가져와

LIMIT은 결과 수를 줄이고 OFFSET은 앞부분을 건너뛰어. ORDER BY 2 DESC처럼 열 번호로 정렬할 수도 있지만 선택 목록이 바뀌면 뜻이 흔들리니 운영 질의에는 이름을 쓰는 편이 안전해. LIMIT 10 OFFSET 100은 100행을 읽고 버린 뒤 10행을 돌려줘.

깊은 페이지에는 키셋을 써

OFFSET 100, OFFSET 1000, OFFSET 10000으로 갈수록 버리는 일이 늘어. 마지막으로 본 id나 정렬 키를 WHERE에 넣으면 색인이 그 다음 범위에서 바로 시작할 수 있어.

Code

정렬·sql
SELECT name, price, created_at
FROM   products
ORDER  BY category ASC, price DESC NULLS LAST;
깊어질수록 느려지는 OFFSET 페이지네이션·sql
-- 페이지 1
SELECT * FROM products ORDER BY created_at DESC LIMIT 20;
-- 페이지 N
SELECT * FROM products ORDER BY created_at DESC LIMIT 20 OFFSET (N-1)*20;
비용이 일정한 키셋 페이지네이션·sql
-- 첫 페이지
SELECT id, name, created_at
FROM   products
ORDER  BY created_at DESC, id DESC
LIMIT  20;

-- 다음 페이지: 마지막 (created_at, id) 를 커서로
SELECT id, name, created_at
FROM   products
WHERE  (created_at, id) < ('2026-04-01 00:00:00', 12345)
ORDER  BY created_at DESC, id DESC
LIMIT  20;

External links

Exercise

OFFSET 페이지네이션 질의 하나를 골라 (sort_column, id) 복합 커서를 쓰는 키셋 방식으로 바꿔. 같은 커서로 다시 요청했을 때 언제나 같은 결과가 나오는지 확인해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.