본문 바로가기
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를 어떤 순서로 돌려줄지는 기본적으로 정해져 있지 않아. 순서가 중요하면 ORDER BY로 못을 박아. 여기에 LIMITOFFSET을 붙이면 페이지네이션이 되고.

  • ORDER BY col [ASC|DESC]가 기본 정렬이야.
  • 키를 여러 개 겹칠 수 있어. ORDER BY brand ASC, price DESC처럼.
  • 표현식으로도 정렬해. ORDER BY length(title) DESC.
  • LIMIT N OFFSET M은 M번째부터 N개를 돌려줘.
  • LIMIT M, N은 옛날식 축약형인데 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 테이블에서 같은 결과를 두 방식으로 뽑아봐. 1000번째 페이지를 OFFSET으로 가져오는 것(offset 19,980)과 이전 페이지 마지막 id를 써서 keyset으로 가져오는 것. .timer on으로 둘을 비교해. keyset이 왜 그렇게 빠른지 노트에 네 말로 설명해봐.

Progress

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

댓글 0

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

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