ORDER BY 여러 열 정렬 LIMIT DISTINCT 조합 📝 문제풀이
◀ 이전 📋 목차 CH 04 ▶
🔃 CHAPTER 03 · 입문

정렬하고, 개수를 줄이고, 중복을 없애기

데이터를 꺼내오는 건 CH 02에서 배웠죠. 이번엔 그 결과를 보기 좋게 정렬(ORDER BY)하고, 필요한 만큼만 잘라내고(LIMIT), 중복을 걷어내는(DISTINCT) 방법을 익혀요. 짧고 자주 쓰는 무기들이에요.

🎯 이 장을 끝내면
🔃
ORDER BY
ORDER BY로 결과를 정렬하기
뽑아온 데이터를 이름순·나이순 등 원하는 순서로 줄 세워요.

SELECT만 쓰면 결과가 저장된 순서(대체로 뒤죽박죽)로 나와요. ORDER BY 뒤에 기준 열을 적으면 그 열을 기준으로 정렬해줘요. 예를 들어 나이순으로 정렬하려면 이렇게 써요.

SELECT name, age
FROM users
ORDER BY age;        -- age(나이) 기준으로 정렬

특별히 방향을 안 적으면 기본은 오름차순(작은 값 → 큰 값)이에요. 오름차순은 ASC, 반대인 내림차순(큰 값 → 작은 값)DESC로 지정해요.

SELECT name, age
FROM users
ORDER BY age DESC;   -- 나이 많은 순(내림차순)
키워드정렬 방향
ASCAscending(오름차순)작은 값 → 큰 값 (기본값)
DESCDescending(내림차순)큰 값 → 작은 값

ORDER BY age DESC의 결과는 나이가 많은 사람부터 나와요.

ORDER BY age DESC 결과
nameage
'민수'30
'영희'25
'철수'20
💡
ORDER BY는 항상 문장 뒤쪽에 와요. FROM·WHERE 다음에 붙는다고 기억하면 돼요. 숫자뿐 아니라 문자(이름)도 정렬돼요 — 문자는 사전순(가나다·ABC 순)으로 줄 서요.
🪜
여러 열 정렬
기준이 여러 개일 때 (콤마로 나열)
앞 기준이 같으면, 다음 기준으로 순서를 정해요.

ORDER BY 뒤에 콤마(,)로 여러 열을 적을 수 있어요. 먼저 적은 기준으로 정렬하다가, 값이 같으면 다음 기준으로 순서를 매겨요.

SELECT name, age
FROM users
ORDER BY age DESC, name ASC;
-- ① 나이 많은 순, ② 나이가 같으면 이름 오름차순
🪜 "1차 정렬 → 2차 정렬" 먼저 age DESC로 나이 많은 순으로 줄을 세워요.
그러다 나이가 똑같은 사람들끼리만 다시 name ASC(이름 오름차순)로 순서를 정해요. 💡 각 열마다 방향(ASC/DESC)을 따로 지정할 수 있어요. 위처럼 앞은 내림차순, 뒤는 오름차순도 가능해요.
🧭
여러 열 정렬은 "동점 처리 규칙"이라고 생각하면 쉬워요. 시험에서 총점이 같으면 이름순으로 등수를 매기는 것과 똑같아요.
✂️
LIMIT
LIMIT으로 개수 제한하기
결과가 아무리 많아도, 위에서 필요한 만큼만 잘라와요.

LIMIT n결과를 위에서부터 n개만 가져와요. ORDER BY와 함께 쓰면 "상위 n명" 같은 걸 쉽게 뽑을 수 있어요. 나이가 많은 상위 3명은 이렇게 써요.

SELECT name, age
FROM users
ORDER BY age DESC   -- ① 나이 많은 순으로 정렬
LIMIT 3;            -- ② 그중 위에서 3명만
ORDER BY age DESC LIMIT 3 결과 (상위 3명)
nameage
'민수'30
'영희'25
'철수'20
⚠️
방언(dialect) 주의. 개수 제한 문법은 제품마다 달라요. MySQL·PostgreSQL·SQLite는 LIMIT을 쓰지만, SQL Server는 TOP(예: SELECT TOP 3 ...), Oracle은 FETCH FIRST를 써요. 이 코스는 LIMIT 기준입니다.
🗄️ 번외편 — DBMS별 SQL 문법 차이 & 프로시저 (LIMIT/TOP/ROWNUM · 자동증가 · NULL · 날짜 · 프로시저 · 트리거) 새 탭 ↗
🧹
DISTINCT
DISTINCT로 중복 제거하기
같은 값이 여러 번 나오면, 한 번씩만 보여줘요.

같은 값이 여러 행에 반복될 때, SELECT 바로 뒤에 DISTINCT를 붙이면 중복을 없애고 서로 다른 값만 남겨요. 예를 들어 회원들이 사는 도시 종류를 알고 싶다면 이렇게 써요.

SELECT DISTINCT city
FROM users;          -- city의 서로 다른 값만 한 번씩
city (원본)SELECT DISTINCT city
'서울', '부산', '서울', '대구', '부산''서울', '부산', '대구'
🧭
DISTINCT선택한 열들의 조합을 기준으로 중복을 판단해요. SELECT DISTINCT city, age처럼 열이 여러 개면, (city, age) 쌍이 같은 경우에만 중복으로 봐요.
🧩
조합
WHERE + ORDER BY + LIMIT, 순서가 중요해요
이 셋을 함께 쓸 때는 정해진 순서로 적어야 해요.

필터링(WHERE)·정렬(ORDER BY)·개수 제한(LIMIT)을 함께 쓸 때는 순서가 정해져 있어요. "20살 이상 회원 중 나이 많은 순 상위 2명"은 이렇게 써요.

SELECT name, age
FROM users
WHERE age >= 20      -- ① 먼저 조건으로 걸러내고
ORDER BY age DESC    -- ② 남은 것을 정렬한 뒤
LIMIT 2;             -- ③ 위에서 2명만
🔎
WHERE
조건으로 거르기
🔃
ORDER BY
남은 것 정렬
✂️
LIMIT
개수 자르기
📐 외우는 순서: WHERE → ORDER BY → LIMIT 이 순서를 바꿔 쓰면 문법 오류가 나요. 항상 거르고(WHERE) → 정렬하고(ORDER BY) → 잘라낸다(LIMIT)는 흐름으로 기억하세요. 💡 실제로 DB가 처리하는 순서도 이와 비슷해요 — 먼저 조건에 맞는 행을 고르고, 정렬한 다음, 위에서 n개를 떼어내요.
💡
모든 절이 필수는 아니에요. 필요 없는 절은 빼도 돼요. 다만 함께 쓸 땐 위 순서만 지키면 됩니다.
🎁 보너스 · 페이지 나누기의 씨앗
나중에 게시판 "다음 페이지" 같은 기능을 만들 때, LIMIT에 시작 위치를 함께 주는 LIMIT 10 OFFSET 20(21번째부터 10개) 형태를 써요. 지금은 "이런 게 있구나" 정도만 알아두세요.
🔤
페이징(paging) — 결과가 아주 많을 때 한꺼번에 다 보여주지 않고 "페이지"로 잘라 조금씩 보여주는 걸 뜻해요(게시판의 1페이지·2페이지처럼요). LIMIT(몇 개 가져올지)과 OFFSET(앞을 몇 개 건너뛸지)을 조합해서 만들어요.
🧠 이 장 핵심 요약
📝
문제풀이 · 점검
배운 걸 가볍게 점검해봐요
시험이 아니라 "내가 이해했나" 확인용이에요. 틀려도 바로 해설이 나와요.
🧪
문제를 풀면 즉시 정답과 해설이 나오고, 위쪽 바에 점수가 쌓여요. 네 가지 유형(객관식 · O/X · 빈칸 · 쿼리결과)을 섞어 두었어요.
CH 04 🧮 연산자와 필터 — 비교·논리 연산자로 조건을 더 정교하게 다루기