본문 바로가기

원칙 4 — ORDER BY + LIMIT

원칙 4 — ORDER BY + LIMIT

어떤 순서로, 몇 개만 볼까?

박지수 팀장 : 민서씨, 단가가 높은 순서대로 정렬해줄 수 있어요? 그리고 가장 비싼 상품 TOP 3만 뽑아주세요. 이번 달 매출 분석하는 데 필요해요.

김민서 사원 : 단가 높은 순서... 그게 무엇일까요? 인가요? LIMIT 3을 쓰면 될까요?

박지수 팀장 : 맞아요. 그리고 그중 상위 세 가지만 뽑는 건 LIMIT이에요. 다만 순서를 정렬하는것은 ORDER BY에요. 이 둘을 세트로 쓰는 경우가 많아요.

원칙 1, 2, 3에서는 내가 분석하고 싶은 테이블에서 원하는 열과 행을 골랐습니다. 이제 그 결과를 원하는 순서로 정렬하고, 필요한 만큼만 가져옵니다.

이런 결과를 원할 때

단가가 높은 순서로 정렬

상품명단가
노트북 Pro1,500,000
노트북 Pro1,500,000
노트북 Air1,200,000
노트북 Air1,200,000
모니터 32인치550,000
......

그 중에서 TOP 3만

상품명단가
노트북 Pro1,500,000
노트북 Pro1,500,000
노트북 Air1,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
웹캠 HD89,000
모니터 27인치350,000
모니터 32인치550,000
노트북 Air1,200,000
노트북 Air1,200,000
노트북 Pro1,500,000
노트북 Pro1,500,000

단가가 낮은 것부터 높은 순서로 정렬됐습니다. ORDER BY는 기본적으로 오름차순(작은 것부터)입니다.

STEP 2 — 내림차순으로 정렬하자

높은 것부터 보고 싶다면 DESC를 붙입니다.

SELECT 상품명, 단가
FROM 판매정보
ORDER BY 단가 DESC;

실행 결과

상품명단가
노트북 Pro1,500,000
노트북 Pro1,500,000
노트북 Air1,200,000
노트북 Air1,200,000
모니터 32인치550,000
모니터 27인치350,000
웹캠 HD89,000
무선 키보드45,000
무선 키보드45,000
USB 허브25,000
마우스 패드15,000
마우스 패드15,000

정렬 방향은 두 가지입니다.

방향의미생략 시
ASC작은 것부터생략 가능
DESC큰 것부터반드시 써야 함

고객정보 테이블에서 나이 순으로 정렬해봅니다.

SELECT 이름, 나이, 등급
FROM 고객정보
ORDER BY 나이 DESC;

실행 결과

이름나이등급
한예진45NULL
최준호41NULL
이지은35일반
강도윤33VIP
오태양31일반
정하윤29프리미엄
김민수28VIP
윤서준27일반
박서연NULLVIP
임수아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;

실행 결과

상품명단가
노트북 Pro1,500,000
노트북 Pro1,500,000
노트북 Air1,200,000

12건에서 단가 상위 3건만 남았습니다. 팀장이 요청한 TOP 3가 완성됐습니다.

나이가 가장 어린 고객 2명도 같은 방식으로 뽑을 수 있습니다.

SELECT 이름, 나이, 등급
FROM 고객정보
WHERE 나이 IS NOT NULL
ORDER BY 나이 ASC
LIMIT 2;

실행 결과

이름나이등급
윤서준27일반
김민수28VIP

나이가 NULL인 행은 WHERE로 먼저 제외하고 정렬했습니다.

STEP 5 — 지금까지 배운 것을 모두 합치자

SELECT, FROM, WHERE, ORDER BY, LIMIT을 한 번에 씁니다.

SELECT 이름, 나이, 등급
FROM 고객정보
WHERE 지역 = '서울'
ORDER BY 나이 DESC
LIMIT 2;

실행 결과

이름나이등급
정하윤29프리미엄
김민수28VIP

서울 고객은 김민수, 박서연, 정하윤, 임수아 네 명입니다. 그 중 나이가 많은 순으로 2명만 뽑았습니다.

판매정보에서도 함께 씁니다.

SELECT 상품명, 단가, 판매일
FROM 판매정보
WHERE 단가 >= 500000
ORDER BY 단가 DESC
LIMIT 3;

실행 결과

상품명단가판매일
노트북 Pro1,500,0002024-01-15
노트북 Pro1,500,0002024-03-15
노트북 Air1,200,0002024-03-01

SQL 실행 순서

코드를 쓰는 순서와 실제 실행 순서는 다릅니다.

실행 순서절역할
1FROM테이블 가져오기
2WHERE행 걸러내기
3SELECT열 고르기
4ORDER BY정렬하기
5LIMIT개수 자르기

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 열 ASCORDER BY 나이 ASC
내림차순 정렬ORDER BY 열 DESCORDER BY 단가 DESC
여러 기준 정렬ORDER BY 열1, 열2ORDER BY 카테고리, 단가 DESC
상위 N개LIMIT NLIMIT 3
정렬 후 상위 N개ORDER BY ... LIMIT NTOP 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;

실행 결과

상품명단가판매일
노트북 Pro1,500,0002024-01-15
노트북 Pro1,500,0002024-03-15
노트북 Air1,200,0002024-03-01

높은 단가부터 정렬한 뒤 3건만 잘랐습니다.

Q3 정답

SELECT 이름, 나이, 등급
FROM 고객정보
WHERE 등급 != '일반'
ORDER BY 나이 DESC
LIMIT 2;

실행 결과

이름나이등급
강도윤33VIP
정하윤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 : 묶어서 집계하면