C.W.K.
Stream
Lesson 04 of 10 · published

ORDER BY 와 LIMIT

~10 min · sql, order-by, limit, pagination

Level 0Scout
0 XP0/80 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

정렬, 캡, 페이징

기본값으로 SELECT 가 반환하는 row 순서는 undefined. 순서 중요하면 ORDER BY 로 명시. LIMIT + OFFSET 과 결합하면 페이지네이션.

  • ORDER BY col [ASC|DESC] — 주 정렬.
  • 다중 정렬 키: ORDER BY brand ASC, price DESC.
  • 표현식 정렬: ORDER BY length(title) DESC.
  • LIMIT N OFFSET M — row M 부터 N 개 반환.
  • LIMIT M, N — 옛 shorthand; LIMIT N OFFSET M 과 동일.
Warning: OFFSET 은 편한데 큰 테이블에서 느림 — SQLite 가 처음 M row 계산하고 버려야 함. 깊은 페이지네이션엔 keyset 페이지네이션 써: WHERE id < last_seen_id ORDER BY id DESC LIMIT 50. 페이지 깊이와 무관하게 상수 시간.

Code

정렬 + 페이징·sql
SELECT id, title, created_at
FROM   conversations
WHERE  archived = 0
ORDER  BY created_at DESC
LIMIT  20;

-- 사이즈 20 의 3 페이지 (offset 기반 — 작은 N 에 OK)
SELECT id, title FROM conversations
ORDER BY created_at DESC LIMIT 20 OFFSET 40;

-- Keyset 페이지네이션 (어떤 깊이서도 빠름)
SELECT id, title FROM conversations
WHERE created_at < ?           -- 이전 페이지 마지막 row 의 created_at
ORDER BY created_at DESC
LIMIT 20;

External links

Exercise

100,000-row 테이블에서 같은 query 두 가지: (1) 페이지 1000 OFFSET 기반 (offset 19,980), (2) 이전 페이지 마지막 id 사용한 keyset. .timer on 으로 비교. Keyset 이 왜 그렇게 빠른지 노트에 설명.

Progress

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

댓글 0

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

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