원칙 4 — ORDER BY + LIMIT
원칙 4 — ORDER BY + LIMIT
어떤 순서로, 몇 개만 볼까?
박지수 팀장 : 민서씨, 단가가 높은 순서대로 정렬해줄 수 있어요? 그리고 가장 비싼 상품 TOP 3만 뽑아주세요. 이번 달 매출 분석하는 데 필요해요.
김민서 사원 : 단가 높은 순서... 그게 무엇일까요? 인가요? LIMIT 3을 쓰면 될까요?
박지수 팀장 : 맞아요. 그리고 그중 상위 세 가지만 뽑는 건 LIMIT이에요. 다만 순서를 정렬하는것은 ORDER BY에요. 이 둘을 세트로 쓰는 경우가 많아요.
원칙 1, 2, 3에서는 내가 분석하고 싶은 테이블에서 원하는 열과 행을 골랐습니다. 이제 그 결과를 원하는 순서로 정렬하고, 필요한 만큼만 가져옵니다.
이런 결과를 원할 때
단가가 높은 순서로 정렬
| 상품명 | 단가 |
|---|---|
| 노트북 Pro | 1,500,000 |
| 노트북 Pro | 1,500,000 |
| 노트북 Air | 1,200,000 |
| 노트북 Air | 1,200,000 |
| 모니터 32인치 | 550,000 |
| ... | ... |
그 중에서 TOP 3만
| 상품명 | 단가 |
|---|---|
| 노트북 Pro | 1,500,000 |
| 노트북 Pro | 1,500,000 |
| 노트북 Air | 1,200,000 |
이 두 가지를 만드는 것이 이번 챕터의 목표입니다.
ORDER BY + LIMIT이 하는 일
SELECT 열이름
FROM 테이블이름
WHERE 조건
ORDER BY 정렬기준열 정렬방향
LIMIT 개수;
ORDER BY— 결과를 특정 열 기준으로 정렬합니다.LIMIT— 정렬된 결과에서 위에서부터 N개만 가져옵니다.
💡 머릿속으로 생각하는 순서
- 어느 테이블에서? →
FROM - 어떤 행만? →
WHERE - 어떤 열을? →
SELECT - 어떤 순서로? →
ORDER BY - 몇 개만? →
LIMIT
이 순서대로 머릿속에 결과를 그리면 코드가 자연스럽게 따라옵니다.
STEP 1 — 결과를 정렬하자
가장 기본적인 정렬입니다. ORDER BY 뒤에 정렬할 열 이름을 씁니다.
SELECT 상품명, 단가
FROM 판매정보
ORDER BY 단가;
실행 결과
| 상품명 | 단가 |
|---|---|
| 마우스 패드 | 15,000 |
| 마우스 패드 | 15,000 |
| USB 허브 | 25,000 |
| 무선 키보드 | 45,000 |
| 무선 키보드 | 45,000 |
| 웹캠 HD | 89,000 |
| 모니터 27인치 | 350,000 |
| 모니터 32인치 | 550,000 |
| 노트북 Air | 1,200,000 |
| 노트북 Air | 1,200,000 |
| 노트북 Pro | 1,500,000 |
| 노트북 Pro | 1,500,000 |
단가가 낮은 것부터 높은 순서로 정렬됐습니다. ORDER BY는 기본적으로 오름차순(작은 것부터)입니다.
STEP 2 — 내림차순으로 정렬하자
높은 것부터 보고 싶다면 DESC를 붙입니다.
SELECT 상품명, 단가
FROM 판매정보
ORDER BY 단가 DESC;
실행 결과
| 상품명 | 단가 |
|---|---|
| 노트북 Pro | 1,500,000 |
| 노트북 Pro | 1,500,000 |
| 노트북 Air | 1,200,000 |
| 노트북 Air | 1,200,000 |
| 모니터 32인치 | 550,000 |
| 모니터 27인치 | 350,000 |
| 웹캠 HD | 89,000 |
| 무선 키보드 | 45,000 |
| 무선 키보드 | 45,000 |
| USB 허브 | 25,000 |
| 마우스 패드 | 15,000 |
| 마우스 패드 | 15,000 |
정렬 방향은 두 가지입니다.
| 방향 | 의미 | 생략 시 |
|---|---|---|
| ASC | 작은 것부터 | 생략 가능 |
| DESC | 큰 것부터 | 반드시 써야 함 |
고객정보 테이블에서 나이 순으로 정렬해봅니다.
SELECT 이름, 나이, 등급
FROM 고객정보
ORDER BY 나이 DESC;
실행 결과
| 이름 | 나이 | 등급 |
|---|---|---|
| 한예진 | 45 | NULL |
| 최준호 | 41 | NULL |
| 이지은 | 35 | 일반 |
| 강도윤 | 33 | VIP |
| 오태양 | 31 | 일반 |
| 정하윤 | 29 | 프리미엄 |
| 김민수 | 28 | VIP |
| 윤서준 | 27 | 일반 |
| 박서연 | NULL | VIP |
| 임수아 | NULL | 프리미엄 |
나이가 NULL인 행은 내림차순에서 가장 아래에 표시됩니다.
STEP 3 — 정렬 기준을 두 개 쓰자
같은 값이 여러 행에 있을 때, 그 안에서 다시 정렬 기준을 정할 수 있습니다. 쉼표로 구분해서 두 번째 기준을 추가합니다.
SELECT 상품명, 카테고리, 단가
FROM 판매정보
WHERE 카테고리 IS NOT NULL
ORDER BY 카테고리 ASC, 단가 DESC;
실행 결과
| 상품명 | 카테고리 | 단가 |
|---|---|---|
| 노트북 Pro | 전자기기 | 1,500,000 |
| 노트북 Pro | 전자기기 | 1,500,000 |
| 노트북 Air | 전자기기 | 1,200,000 |
| 노트북 Air | 전자기기 | 1,200,000 |
| 모니터 32인치 | 전자기기 | 550,000 |
| 모니터 27인치 | 전자기기 | 350,000 |
| 무선 키보드 | 주변기기 | 45,000 |
| 무선 키보드 | 주변기기 | 45,000 |
| USB 허브 | 주변기기 | 25,000 |
| 마우스 패드 | 주변기기 | 15,000 |
| 마우스 패드 | 주변기기 | 15,000 |
카테고리가 가나다순(전자기기 → 주변기기)으로 정렬되고, 같은 카테고리 안에서는 단가가 높은 순서로 정렬됐습니다.
첫 번째 기준으로 큰 틀을 잡고, 두 번째 기준으로 같은 값 안의 순서를 정합니다.
STEP 4 — 상위 N개만 가져오자
정렬한 결과에서 위에서부터 N개만 가져올 때 LIMIT을 씁니다. ORDER BY와 함께 쓸 때 가장 유용합니다.
SELECT 상품명, 단가
FROM 판매정보
ORDER BY 단가 DESC
LIMIT 3;
실행 결과
| 상품명 | 단가 |
|---|---|
| 노트북 Pro | 1,500,000 |
| 노트북 Pro | 1,500,000 |
| 노트북 Air | 1,200,000 |
12건에서 단가 상위 3건만 남았습니다. 팀장이 요청한 TOP 3가 완성됐습니다.
나이가 가장 어린 고객 2명도 같은 방식으로 뽑을 수 있습니다.
SELECT 이름, 나이, 등급
FROM 고객정보
WHERE 나이 IS NOT NULL
ORDER BY 나이 ASC
LIMIT 2;
실행 결과
| 이름 | 나이 | 등급 |
|---|---|---|
| 윤서준 | 27 | 일반 |
| 김민수 | 28 | VIP |
나이가 NULL인 행은 WHERE로 먼저 제외하고 정렬했습니다.
STEP 5 — 지금까지 배운 것을 모두 합치자
SELECT, FROM, WHERE, ORDER BY, LIMIT을 한 번에 씁니다.
SELECT 이름, 나이, 등급
FROM 고객정보
WHERE 지역 = '서울'
ORDER BY 나이 DESC
LIMIT 2;
실행 결과
| 이름 | 나이 | 등급 |
|---|---|---|
| 정하윤 | 29 | 프리미엄 |
| 김민수 | 28 | VIP |
서울 고객은 김민수, 박서연, 정하윤, 임수아 네 명입니다. 그 중 나이가 많은 순으로 2명만 뽑았습니다.
판매정보에서도 함께 씁니다.
SELECT 상품명, 단가, 판매일
FROM 판매정보
WHERE 단가 >= 500000
ORDER BY 단가 DESC
LIMIT 3;
실행 결과
| 상품명 | 단가 | 판매일 |
|---|---|---|
| 노트북 Pro | 1,500,000 | 2024-01-15 |
| 노트북 Pro | 1,500,000 | 2024-03-15 |
| 노트북 Air | 1,200,000 | 2024-03-01 |
SQL 실행 순서
코드를 쓰는 순서와 실제 실행 순서는 다릅니다.
| 실행 순서 | 절 | 역할 |
|---|---|---|
| 1 | FROM | 테이블 가져오기 |
| 2 | WHERE | 행 걸러내기 |
| 3 | SELECT | 열 고르기 |
| 4 | ORDER BY | 정렬하기 |
| 5 | LIMIT | 개수 자르기 |
ORDER BY가 SELECT보다 나중에 실행되기 때문에, ORDER BY에서는 SELECT에서 만든 별칭(AS)을 쓸 수 있습니다.
SELECT 단가 * 0.9 AS 할인가
FROM 판매정보
ORDER BY 할인가 DESC;
자주 하는 실수
- 실수 1 —
LIMIT을ORDER BY앞에 쓴다
-- ❌ 순서가 잘못됐습니다
SELECT 상품명, 단가
FROM 판매정보
LIMIT 3
ORDER BY 단가 DESC;
-- ✅ ORDER BY가 LIMIT보다 앞에 와야 합니다
SELECT 상품명, 단가
FROM 판매정보
ORDER BY 단가 DESC
LIMIT 3;
ORDER BY 없이 LIMIT만 쓰면 정렬이 보장되지 않습니다. 어떤 3행이 나올지 알 수 없습니다.
- 실수 2 — 내림차순에서
DESC를 빠뜨린다
-- ❌ DESC 없으면 오름차순 (낮은 것부터)
SELECT 상품명, 단가
FROM 판매정보
ORDER BY 단가
LIMIT 3;
실행 결과(의도와 다름)
| 상품명 | 단가 |
|---|---|
| 마우스 패드 | 15,000 |
| 마우스 패드 | 15,000 |
| USB 허브 | 25,000 |
높은 것부터 원했는데 낮은 것부터 나왔습니다.
-- ✅ 높은 것부터 원하면 DESC
SELECT 상품명, 단가
FROM 판매정보
ORDER BY 단가 DESC
LIMIT 3;
개념 정리
| 기능 | 코드 | 예시 |
|---|---|---|
| 오름차순 정렬 | ORDER BY 열 ASC | ORDER BY 나이 ASC |
| 내림차순 정렬 | ORDER BY 열 DESC | ORDER BY 단가 DESC |
| 여러 기준 정렬 | ORDER BY 열1, 열2 | ORDER BY 카테고리, 단가 DESC |
| 상위 N개 | LIMIT N | LIMIT 3 |
| 정렬 후 상위 N개 | ORDER BY ... LIMIT N | TOP 3 패턴 |
연습문제
Q1. ★☆☆ 고객정보 테이블에서 모든 고객을 나이가 어린 순서대로 정렬해서 이름과 나이를 조회하세요.
Q2. ★★☆ 판매정보 테이블에서 단가가 가장 높은 판매 내역 상위 3건의 상품명, 단가, 판매일을 조회하세요.
Q3. ★★★ 고객정보 테이블에서 일반 등급을 제외한 고객 중 나이가 가장 많은 순서로 상위 2명의 이름, 나이, 등급을 조회하세요.
정답 및 해설
Q1 정답
SELECT 이름, 나이
FROM 고객정보
ORDER BY 나이 ASC;
실행 결과
| 이름 | 나이 |
|---|---|
| 박서연 | NULL |
| 임수아 | NULL |
| 윤서준 | 27 |
| 김민수 | 28 |
| 정하윤 | 29 |
| 오태양 | 31 |
| 강도윤 | 33 |
| 이지은 | 35 |
| 최준호 | 41 |
| 한예진 | 45 |
ASC는 생략해도 결과가 같습니다. ORDER BY의 기본값이 오름차순이기 때문입니다. 나이가 NULL인 행은 오름차순에서 가장 위에 나옵니다.
Q2 정답
SELECT 상품명, 단가, 판매일
FROM 판매정보
ORDER BY 단가 DESC
LIMIT 3;
실행 결과
| 상품명 | 단가 | 판매일 |
|---|---|---|
| 노트북 Pro | 1,500,000 | 2024-01-15 |
| 노트북 Pro | 1,500,000 | 2024-03-15 |
| 노트북 Air | 1,200,000 | 2024-03-01 |
높은 단가부터 정렬한 뒤 3건만 잘랐습니다.
Q3 정답
SELECT 이름, 나이, 등급
FROM 고객정보
WHERE 등급 != '일반'
ORDER BY 나이 DESC
LIMIT 2;
실행 결과
| 이름 | 나이 | 등급 |
|---|---|---|
| 강도윤 | 33 | VIP |
| 정하윤 | 29 | 프리미엄 |
WHERE로 일반 등급을 먼저 걸러낸 뒤, 남은 행을 나이 내림차순으로 정렬하고 LIMIT 2로 상위 2명만 가져왔습니다. 등급이 NULL인 고객도 != 조건에 의해 제외됩니다.
WHERE → ORDER BY → LIMIT 순서로 처리됩니다.
먼저 걸러내고, 그 다음 정렬하고, 마지막에 자릅니다.
실무 패턴
패턴 1 — TOP N 뽑기
실무에서 가장 자주 쓰는 패턴입니다.
SELECT 상품명, 단가
FROM 판매정보
ORDER BY 단가 DESC
LIMIT 5;
SELECT 상품명, 단가, 판매일
FROM 판매정보
ORDER BY 판매일 DESC
LIMIT 10;
대시보드의 "TOP 10", "최근 N건" 같은 항목은 모두 이 패턴으로 만듭니다.
패턴 2 — 조건 + 정렬 + 개수 세트
SELECT 이름, 나이, 등급
FROM 고객정보
WHERE 등급 IN ('VIP', '프리미엄')
ORDER BY 나이 DESC
LIMIT 5;
WHERE로 대상을 좁히고, ORDER BY로 우선순위를 정하고, LIMIT으로 필요한 만큼만 가져옵니다.
이 세 가지 세트가 실무 분석의 기본 틀입니다.
김민서 사원
팀장님, 단가 높은 순으로 TOP 3 뽑았어요! ORDER BY랑 LIMIT을 같이 쓰니까 원하는 게 딱 나오네요.
박지수 팀장
잘 했어요. 그런데 민서씨, 상품명별로 얼마씩 팔렸는지 합계를 내고 싶으면 어떻게 할까요? 지금까지 배운 것으로는 안 되거든요.
▶ 원칙 5 + 6 — GROUP BY + HAVING : 묶어서 집계하면