모든 강의를 무료로 볼 수 있어요. 회원가입 없이도 학습 가능합니다.

7강 / 전체 8강

정렬과 제한

8분 읽기 조회 0

ORDER BY로 결과를 원하는 순서로 정렬하고, LIMIT·OFFSET으로 페이지 단위 조회를 구현합니다.

🎯 학습 목표

이 강을 마치면 SELECT 결과를 원하는 기준으로 오름차순·내림차순 정렬할 수 있고, 여러 열을 기준으로 복합 정렬할 수 있습니다. 또한 LIMIT으로 결과 행 수를 제한하고 OFFSET으로 특정 위치부터 조회하는 페이지네이션을 구현할 수 있게 됩니다. "가장 비싼 도서 TOP 3", "최근 주문 5건"처럼 순위·랭킹 형태의 실용적인 쿼리를 작성할 수 있습니다.

💡 정렬이 필요한 이유

이 섹션에서는 SQL 결과 정렬이 왜 중요한지 살펴보겠습니다.

데이터베이스는 행을 저장하는 순서가 보장되지 않습니다. 오늘 INSERT한 순서대로 나온다고 가정하고 쿼리를 작성하면, 데이터가 많아지거나 시스템이 변경될 때 순서가 달라져 버그가 생길 수 있습니다. "항상 같은 순서로 결과를 보장"하고 싶다면 반드시 ORDER BY를 명시해야 합니다.

실무에서 정렬이 필요한 상황은 무수히 많습니다. 상품 목록을 가격 낮은 순으로, 최근 주문을 날짜 순으로, 이름을 가나다순으로 정렬하는 것이 모두 ORDER BY로 처리됩니다. 또한 LIMIT과 결합하면 "상위 N개"를 뽑는 랭킹 쿼리가 됩니다.

📊 ORDER BY — 정렬 기준 지정

이 섹션에서는 ORDER BY의 기본 사용법과 오름차순·내림차순 지정 방법을 살펴보겠습니다.

ORDER BY는 SELECT 문의 마지막에 위치하며, 어떤 열을 기준으로 정렬할지 지정합니다. 기본 정렬 방향은 오름차순(ASC, Ascending)입니다. 내림차순으로 정렬하려면 DESC(Descending)를 붙입니다.

-- 가격 오름차순 (ASC는 생략 가능)
SELECT title, price
FROM books
ORDER BY price ASC;

-- 가격 내림차순
SELECT title, price
FROM books
ORDER BY price DESC;

첫 번째 쿼리는 '채식주의자'(13,000원)부터 '클린 코드'(33,000원)까지 가격이 낮은 순서로 나타납니다. 두 번째 쿼리는 반대로 '클린 코드'부터 '채식주의자' 순서로 나타납니다.

문자열도 정렬할 수 있습니다. 한국어는 가나다순(유니코드 순서)으로 정렬됩니다.

SELECT name, grade, join_date
FROM members
ORDER BY name ASC;

가나다순으로 '김민준', '박지훈', '이서연', '정하늘', '최유진' 순서로 나타납니다.

날짜 정렬도 문자열 비교 방식(YYYY-MM-DD 형식이면 정렬 결과가 날짜 순서와 일치)으로 자연스럽게 동작합니다.

SELECT order_id, order_date, status
FROM orders
ORDER BY order_date DESC;

가장 최근 주문(2024-06-05)부터 가장 오래된 주문(2024-03-01) 순으로 나타납니다.

🔀 복합 정렬 — 여러 열 기준

이 섹션에서는 두 개 이상의 열을 기준으로 정렬하는 복합 정렬을 살펴보겠습니다.

ORDER BY에 열을 여러 개 나열하면 순서대로 정렬 기준이 적용됩니다. 첫 번째 열 값이 같으면 두 번째 열로, 두 번째도 같으면 세 번째 열로 정렬합니다.

SELECT title, category, price
FROM books
ORDER BY category ASC, price DESC;

카테고리를 가나다순으로 먼저 정렬하고, 같은 카테고리 안에서는 가격 높은 순으로 정렬합니다. 결과는 'IT' 카테고리(클린 코드 33,000 → 파이썬 독학 28,000 → SQL 첫걸음 22,000), '경제' 카테고리(부의 추월차선 16,000 → 돈의 심리학 17,000—아, 경제 카테고리가 두 권이므로 가격 내림차순), '소설' 카테고리 순서로 나타납니다.

회원 정보를 등급 오름차순, 같은 등급 안에서 가입일 최신순으로 정렬해 봅니다.

SELECT name, grade, join_date
FROM members
ORDER BY grade ASC, join_date DESC;

PREMIUM 1명, REGULAR 2명, VIP 2명 순으로 나오고, 같은 등급 내에서는 최근 가입한 회원이 먼저 나타납니다.

ORDER BY에는 열 번호도 사용할 수 있습니다. SELECT에서 세 번째로 나열한 열을 기준으로 정렬하려면 ORDER BY 3이라고 씁니다. 하지만 열 번호는 SELECT 순서가 바뀌면 의미가 달라지므로, 유지보수 측면에서 열 이름을 명시적으로 쓰는 것이 권장됩니다.

✂️ LIMIT — 결과 행 수 제한

이 섹션에서는 결과에서 원하는 수의 행만 가져오는 LIMIT을 살펴보겠습니다.

LIMIT N은 결과의 처음 N개 행만 반환합니다. ORDER BY와 함께 사용하면 "상위 N개"를 뽑는 랭킹 쿼리가 됩니다.

-- 가장 비싼 도서 상위 3권
SELECT title, price
FROM books
ORDER BY price DESC
LIMIT 3;

'클린 코드'(33,000원), '파이썬 독학'(28,000원), 'SQL 첫걸음'(22,000원) 세 권이 나타납니다.

-- 가장 최근 주문 5건
SELECT order_id, member_id, order_date, status
FROM orders
ORDER BY order_date DESC
LIMIT 5;

최근 5건의 주문이 나타납니다.

LIMIT은 ORDER BY 없이도 쓸 수 있지만, 이 경우 어떤 행이 반환될지 보장되지 않습니다. 의미 있는 "상위 N개"를 얻으려면 항상 ORDER BY와 함께 사용하는 것이 원칙입니다.

LIMIT의 실행 순서 위치도 중요합니다. 전체 실행 순서에서 LIMIT은 가장 마지막에 적용됩니다. FROM → WHERE → SELECT → ORDER BY → LIMIT 순서입니다. 즉, 먼저 전체 행을 가져와 조건으로 필터링하고 정렬한 다음, 마지막으로 행 수를 자르는 것입니다.

📄 OFFSET — 건너뛰고 시작하기

이 섹션에서는 특정 위치부터 조회를 시작하는 OFFSET과 페이지네이션 패턴을 살펴보겠습니다.

OFFSET N은 결과의 처음 N개 행을 건너뛰고 그 다음부터 반환합니다. LIMIT과 함께 쓰면 페이지네이션(Pagination)을 구현할 수 있습니다. 웹 게시판에서 1페이지·2페이지처럼 분할해서 데이터를 가져오는 패턴이 이것입니다.

-- 1페이지: 1~3번 도서
SELECT title, price
FROM books
ORDER BY book_id ASC
LIMIT 3 OFFSET 0;

-- 2페이지: 4~6번 도서
SELECT title, price
FROM books
ORDER BY book_id ASC
LIMIT 3 OFFSET 3;

-- 3페이지: 7번 도서
SELECT title, price
FROM books
ORDER BY book_id ASC
LIMIT 3 OFFSET 6;

페이지 번호(page)와 페이지당 항목 수(pageSize)로 OFFSET을 계산하는 공식은 OFFSET = (page - 1) * pageSize입니다. 1페이지면 OFFSET 0, 2페이지면 OFFSET 3, 3페이지면 OFFSET 6이 됩니다.

SQLite에서는 LIMIT N OFFSET M 대신 축약 형태인 LIMIT M, N도 사용할 수 있습니다. 단, 이 형식은 순서가 반대라 헷갈리기 쉬우므로 가독성이 좋은 LIMIT N OFFSET M 형태를 권장합니다.

⚠️ 정렬·제한 관련 주의사항

이 섹션에서는 ORDER BY와 LIMIT 사용 시 자주 만나는 함정을 살펴보겠습니다.

첫 번째 주의사항은 ORDER BY 없는 LIMIT은 신뢰할 수 없다는 점입니다. LIMIT 3만 쓰면 "어떤 3개"인지 보장되지 않습니다. 데이터가 추가·삭제·수정되면 결과가 달라질 수 있습니다. 반드시 ORDER BY로 정렬 기준을 명시한 뒤 LIMIT을 사용하세요.

두 번째는 NULL의 정렬 위치입니다. 6강에서 grade가 NULL인 홍길동을 추가했다면, ORDER BY grade ASC 시 NULL은 SQLite에서 가장 앞(작은 값 취급)에 나타납니다. MySQL과 PostgreSQL은 반대로 NULL을 가장 큰 값으로 처리해 내림차순 정렬 시 맨 앞에 나타납니다. DBMS마다 다르므로 NULL이 포함된 열을 정렬할 때는 주의가 필요합니다.

세 번째는 OFFSET이 커질수록 느려진다는 점입니다. OFFSET 1000이면 1001번째 행부터 반환하지만, 내부적으로는 1000개를 모두 읽고 버린 뒤 시작합니다. 데이터가 수백만 건이면 큰 OFFSET은 성능 문제를 일으킵니다. 실무에서는 커서 기반 페이지네이션(마지막으로 본 행의 ID를 기준으로 WHERE로 필터링)을 사용하는 경우가 많습니다. 하지만 입문 단계에서는 LIMIT·OFFSET 패턴을 완전히 익혀두는 것이 우선입니다.

📝 핵심 요약

이번 강에서 배운 내용을 정리하겠습니다.

문법역할예시
ORDER BY 열 ASC오름차순 정렬 (기본값)ORDER BY price ASC
ORDER BY 열 DESC내림차순 정렬ORDER BY price DESC
ORDER BY 열1, 열2 DESC복합 정렬ORDER BY category, price DESC
LIMIT N결과 상위 N행만 반환LIMIT 3
LIMIT N OFFSET MM개 건너뛰고 N개 반환LIMIT 3 OFFSET 6

ORDER BY + LIMIT 조합은 랭킹·최신 항목 조회에서 가장 많이 쓰이는 패턴 중 하나입니다. 다음 8강에서는 중복 제거(DISTINCT)와 열 값에 다양한 수학 계산을 적용하는 방법을 배웁니다. "카테고리 종류가 몇 가지인지", "평균 가격은 얼마인지"를 한 줄 쿼리로 파악할 수 있게 됩니다.

관련 주제

  • ORDER BY
  • ASC DESC
  • LIMIT
  • OFFSET
  • 페이지네이션 쿼리
  • 개발·프로그래밍
  • 개발·프로그래밍 강의
  • SQL·데이터베이스 입문 24강
  • 무료강의
  • 무료 온라인 강의
  • NUGUNA
  • 누구나

📚 시리즈 전체 공유

SQL·데이터베이스 입문 24강

이 강의가 속한 시리즈는 총 8강, 모두 무료입니다. 처음부터 배우려는 동료에게 시리즈 전체를 알려 주세요.

댓글

0/1000

불러오는 중...