비싼 순으로 줄 세우고, 딱 5개만 —
ORDER BY 와 LIMIT
3-2에서 WHERE 로 행을 걸렀다면, 이번엔 결과를 원하는 순서로 줄 세우고(ORDER BY) 위에서 N개만 끊어옵니다(LIMIT). "가장 비싼 상품 TOP 5", "최근 가입자 5명" — SQL 에서 가장 자주 쓰는 패턴이 이 강의에서 손에 잡힙니다.
이번 섹션의 여정
완료 ✓
지금 여기
GROUP BY · HAVING
JOIN · 뻥튀기 함정 ⭐ · CASE
강의 메인
오늘 배우는 두 가지 — 줄 세우기, 그리고 끊기
지금까지 SELECT 로 꺼내고 WHERE 로 걸렀습니다. 그런데 실무 요구는 한 발 더 나갑니다 — “가격 비싼 순으로 보고 싶다”, “상위 5개만 보고 싶다”. 이걸 해결하는 게 오늘의 두 절, ORDER BY(정렬)와 LIMIT(행 제한)입니다.
ORDER BY — 결과를 줄 세운다
바로 쳐보겠습니다. 상품을 가격 비싼 순으로 정렬하는 쿼리입니다.
SELECT
*
FROM
products
ORDER BY
price DESC;| product_id | product_name | price | category_id |
|---|---|---|---|
| 8 | 패딩 점퍼 | 129000 | 1 |
| 9 | 무선 이어폰 | 89000 | 2 |
| 29 | 향수 | 89000 | 5 |
| 15 | 키보드 | 75000 | 2 |
| 3 | 후드 집업 | 65000 | 1 |
| ⋮ | |||
DESC 가 내림차순(큰 → 작은)이라는 뜻입니다. 방향 키워드는 딱 두 개뿐이에요.
| 키워드 | 의미 |
|---|---|
ASC | 오름차순 (작은 → 큰). 기본값 — 안 써도 ASC |
DESC | 내림차순 (큰 → 작은) |
ASC 는 생략 가능, DESC 는 명시 필수. ORDER BY price 라고만 쓰면 자동으로
오름차순입니다. 내림차순을 원하면 반드시 DESC 를 붙여야 해요.
숫자만 정렬되는 게 아닙니다. 날짜도 똑같이 줄 세울 수 있어요.
-- 가입일 오래된 순 (ASC 는 생략 — 기본값)
SELECT
*
FROM
members
ORDER BY
joined_at;
-- 가입일 최신 순 (DESC 는 반드시 명시)
SELECT
*
FROM
members
ORDER BY
joined_at DESC;다중 정렬 — 1차로 묶고, 2차로 다시 줄 세운다
정렬 기준은 하나가 아니어도 됩니다. 콤마로 구분해서 여러 컬럼을 줄 세울 수 있어요.
SELECT
*
FROM
members
ORDER BY
gender ASC,
age DESC;“성별로 먼저 정렬(F → M), 같은 성별 안에서는 나이 많은 순.”
| member_id | member_name | gender | age | joined_at |
|---|---|---|---|---|
| 18 | 안소영 | F | 44 | 2026-03-10 |
| 12 | 오지은 | F | 40 | 2025-10-05 |
| 6 | 강서연 | F | 38 | 2025-04-12 |
| ⋮ | ||||
| 15 | 권현석 | M | 50 | 2026-01-08 |
| 9 | 조성민 | M | 45 | 2025-07-22 |
| 3 | 박민수 | M | 42 | 2025-02-10 |
| ⋮ | ||||
왼쪽이 1차 정렬, 오른쪽이 2차 정렬. 1차 기준에서 동률인 행만 2차 기준으로 다시 정렬됩니다. F 끼리 한 덩어리로 묶이고, 그 안에서 나이순으로 다시 줄을 서는 거예요.
“부서별로 정렬, 같은 부서 안에선 직급 순”, “카테고리별, 같은 카테고리 안에선 가격 내림차순” — 회사 보고서의 단골 요구가 전부 이 패턴입니다.
아까 결과에서 무선 이어폰과 향수가 둘 다 89,000원이었죠. 정렬 기준이 같으면
둘 중 뭐가 먼저 나올지는 DB 마음입니다. 순서까지 못 박고 싶다면 ORDER BY price DESC, product_id 처럼 보조 정렬 컬럼을 하나 더 붙이면 됩니다 — 방금
배운 다중 정렬이 바로 그 해결책이에요.
LIMIT — 위에서 N개만 끊는다
정렬했으면, 이제 위에서 끊을 차례입니다.
SELECT
*
FROM
products
ORDER BY
price DESC
LIMIT 5;| product_id | product_name | price | category_id |
|---|---|---|---|
| 8 | 패딩 점퍼 | 129000 | 1 |
| 9 | 무선 이어폰 | 89000 | 2 |
| 29 | 향수 | 89000 | 5 |
| 15 | 키보드 | 75000 | 2 |
| 3 | 후드 집업 | 65000 | 1 |
여기서 중요한 건 LIMIT 은 거의 항상 ORDER BY 와 한 세트라는 점입니다.
LIMIT 5 — “어떤” 5개인지 모름
정렬 기준이 없으면 그냥 DB가 주는 대로 위에서 5개입니다. 어떤 행이 올지 보장이 없어서, 의미 있는 TOP 5가 아니에요.
줄 세운 다음 끊어야 TOP 5
먼저 ORDER BY 로 줄 세우고, 그 다음 LIMIT 으로 위에서 끊어야 “가장 비싼 5개”라는 의미가 생깁니다.
ORDER BY + LIMIT. “인기 상품 TOP 10”, “최근 가입자 5명”, “매출 상위 100건” — 전부 이 두 줄 패턴입니다. 이 조합은 외워두세요.
하나 더 쳐볼게요 — “가장 최근에 가입한 5명”.
SELECT
*
FROM
members
ORDER BY
joined_at DESC
LIMIT 5;| member_id | member_name | gender | age | joined_at |
|---|---|---|---|---|
| 20 | 백서윤 | F | 21 | 2026-04-02 |
| 19 | 류재민 | M | 32 | 2026-03-25 |
| 18 | 안소영 | F | 44 | 2026-03-10 |
| 17 | 황태웅 | M | 26 | 2026-02-28 |
| 16 | 노수아 | F | 30 | 2026-02-15 |
OFFSET — 페이지 넘기기 (선택)
TOP 5 말고 “6위부터 10위” 가 보고 싶다면? OFFSET 으로 앞에서 몇 개를 건너뛸지 정합니다.
SELECT
*
FROM
products
ORDER BY
price DESC
LIMIT 5 OFFSET 5;| 쿼리 | 결과 범위 |
|---|---|
LIMIT 5 OFFSET 0 | 1 ~ 5위 |
LIMIT 5 OFFSET 5 | 6 ~ 10위 |
LIMIT 5 OFFSET 10 | 11 ~ 15위 |
게시판이나 쇼핑몰의 페이징(1페이지, 2페이지…)이 이 원리로 돌아갑니다. 다만
학습 단계에서는 LIMIT 만 알아도 충분해요 — OFFSET 은 “이런 게 있다” 정도로만
기억하고 넘어갑시다.
한눈에 정리
| 키워드 | 의미 | 예시 |
|---|---|---|
ORDER BY a | a 오름차순 (기본값) | ORDER BY price |
ORDER BY a DESC | a 내림차순 | ORDER BY price DESC |
ORDER BY a, b DESC | a 우선, 같은 a 끼리 b 내림 | ORDER BY gender, age DESC |
LIMIT N | 상위 N 개 | LIMIT 5 |
LIMIT N OFFSET M | M 개 건너뛰고 N 개 | LIMIT 5 OFFSET 5 |
ORDER BY 로 줄 세우고, LIMIT 으로 위에서 끊는다. 이 두 줄이 “가장 비싼 상품 TOP 5” 같은 실무 질문의 표준 답안입니다.
자주 막히는 지점
SQL 은 절을 쓰는 순서가 정해져 있습니다. 순서를 바꾸면 syntax error 가 납니다.
이 쿼리에서 gender 는 방향이 생략됐으니 기본값 ASC, age 만 DESC 입니다.
ORDER BY gender DESC, age DESC 처럼 컬럼마다 붙이세요.정렬 기준이 없거나 동률인 행이 있으면 순서가 보장되지 않습니다. 고장이 아니라 SQL 의 원래 동작이에요.
ORDER BY price DESC, product_id 처럼 보조 정렬 컬럼을 붙이세요.짧고 굵게 끝났습니다. 연습 문제로 손에 익혀두세요 — 다음 3-4에서는 “카테고리별 상품 수가 몇 개야?” 같은 “~별” 사고법, GROUP BY 와 집계 함수로 넘어갑니다.