ORDER BY로 정렬하기

Ryan·2025년 1월 14일

SQL/Python 분석

목록 보기
49/94

데이터를 조회할 때, 정렬은 아주 빈번하게 쓰이는 기능 중 하나입니다. 예를 들어, 직원 목록을 월급이 높은 순으로 보고 싶거나, 영업 데이터를 날짜가 빠른 순으로 확인하고 싶을 때가 있죠. 이럴 때 사용하는 구문이 바로 ORDER BY입니다. 이번 글에서는 ORDER BY 구문의 기본 사용법부터 실무 예시, 주의사항 등을 살펴보겠습니다.


1. ORDER BY 기본 문법

sql
코드 복사
SELECT 컬럼1, 컬럼2, ...
FROM 테이블명
[WHERE 조건]
GROUP BY 그룹화_컬럼
ORDER BY 컬럼A [ASC | DESC], 컬럼B [ASC | DESC], ...;
  1. ORDER BY 컬럼A: 컬럼A를 기준으로 정렬
  2. ASC(오름차순) | DESC(내림차순)
    • 기본값은 ASC
    • 예: ORDER BY 컬럼A DESC → 컬럼A 값이 큰 것부터
  3. 여러 컬럼을 같이 정렬하고 싶다면 콤마로 구분
    • 예: ORDER BY 컬럼A DESC, 컬럼B ASC
    • 먼저 컬럼A 기준으로 내림차순 정렬 후, 같은 A 값 내에서는 컬럼B를 오름차순 정렬

2. 간단한 예시

2.1 오름차순 정렬

sql
코드 복사
SELECT name, MonthlyIncome
FROM employee
ORDER BY MonthlyIncome ASC;
  • employee 테이블에서 직원명(name)과 월급(MonthlyIncome)을 조회
  • 월급이 낮은 순(오름차순)으로 정렬
  • ASC는 생략 가능하므로 ORDER BY MonthlyIncome;로 써도 같은 결과

2.2 내림차순 정렬

sql
코드 복사
SELECT name, MonthlyIncome
FROM employee
ORDER BY MonthlyIncome DESC;
  • 월급이 높은 순으로 정렬

2.3 다중 컬럼 정렬

sql
코드 복사
SELECT Department, name, MonthlyIncome
FROM employee
ORDER BY Department ASC, MonthlyIncome DESC;
  1. 먼저 Department 컬럼 기준으로 오름차순 정렬
  2. 같은 Department 내에서는 MonthlyIncome이 높은 순(내림차순)으로 정렬

3. GROUP BY와 ORDER BY 조합

집계 함수를 사용해 그룹화한 뒤, 그 결과를 정렬하려면 GROUP BYORDER BY를 함께 씁니다.

sql
코드 복사
SELECT Department, AVG(MonthlyIncome) AS avg_income
FROM employee
GROUP BY Department
ORDER BY avg_income DESC;
  • 부서별 평균 월급을 구한 뒤, 평균 월급이 높은 부서부터 나열

4. 컬럼 인덱스 사용 (주의)

일부 DBMS에서는 SELECT 목록 중 몇 번째 컬럼을 기준으로 정렬할 수도 있습니다(오래된 SQL 스타일).

sql
코드 복사
SELECT Department, MonthlyIncome
FROM employee
ORDER BY 2 DESC;  -- 두 번째 컬럼(MonthlyIncome)을 기준으로 내림차순 정렬
  • 하지만, 이 방식은 가독성이 떨어지고, SELECT 목록이 변하면 문제가 생기므로 권장되지 않습니다.
  • 되도록이면 명시적으로 컬럼 이름을 사용하세요.

5. 정렬 기준으로 표현식 사용

ORDER BY에는 컬럼명 뿐만 아니라, 표현식(expression)이나 별칭(alias)도 사용 가능합니다.

5.1 산술 표현식

sql
코드 복사
SELECT product_id, price, quantity, (price * quantity) AS total_amount
FROM sales
ORDER BY (price * quantity) DESC;
  • (price × quantity) 값을 기준으로 내림차순 정렬
  • 별칭 total_amount가 있다면, ORDER BY total_amount DESC로도 가능

5.2 CASE WHEN 표현식

sql
코드 복사
SELECT name, department,
CASE
  WHEN department = 'Sales' THEN 1
  ELSE 2
END AS dept_order
FROM employee
ORDER BY dept_order, name;
  • 부서가 Sales인 직원을 먼저 보여주고(1), 그 뒤에 다른 부서 직원을 보여주기(2)

6. LIMIT/FETCH와 함께 사용

많은 경우 정렬된 결과에서 상위 N개만 보고 싶을 때가 있습니다(예: 월급 TOP 10).

MySQL과 MariaDB, PostgreSQL 등에서는 LIMIT, Oracle의 경우 FETCH FIRST N ROWS, SQL Server는 TOP N 등을 사용합니다.

6.1 MySQL/MariaDB/PostgreSQL 예시

sql
코드 복사
SELECT name, MonthlyIncome
FROM employee
ORDER BY MonthlyIncome DESC
LIMIT 10;
  • 월급이 가장 높은 직원 10명을 출력

6.2 Oracle 예시

sql
코드 복사
SELECT name, MonthlyIncome
FROM employee
ORDER BY MonthlyIncome DESC
FETCH FIRST 10 ROWS ONLY;

7. 실무 시 주의사항 & 팁

  1. 인덱스와 정렬
    • ORDER BY에 사용되는 컬럼이 인덱스로 잡혀 있으면 성능에 유리
    • 하지만 다중 컬럼 정렬이 복잡해지면 인덱스만으로 해결 안 될 수도 있음
  2. 집계 결과 정렬
    • GROUP BY 후 HAVING절을 쓴 뒤 ORDER BY를 적용할 수 있음 (순서: GROUP BY → HAVING → ORDER BY)
  3. 대소문자 구분
    • 문자열 정렬 시, DBMS의 Collation(정렬 규칙)에 따라 대소문자/특수문자 정렬 순서가 달라질 수 있음
  4. NULL의 정렬 순서
    • DBMS마다 NULL이 가장 앞에 오거나 가장 뒤에 오기도 함
    • 예: ORDER BY 컬럼 ASC NULLS FIRST 또는 NULLS LAST 같은 구문이 지원되기도 함 (Oracle, PostgreSQL 등)
  5. 성능 테스트
    • 대규모 데이터셋에서 ORDER BY가 큰 부하를 야기할 수 있음. 인덱스, 파티셔닝, 중간 테이블 활용 등 최적화 전략 고려

마무리

ORDER BY는 SQL에서 결과를 원하는 순서로 정렬하기 위한 핵심 구문입니다.

  • 기본적으로 ASC(오름차순)와 DESC(내림차순) 키워드를 사용
  • 여러 컬럼을 콤마로 구분하여 다중 정렬 가능
  • 표현식, CASE WHEN, 별칭 등을 활용해 더욱 유연한 정렬 로직 구성 가능
  • LIMIT(MySQL) / FETCH FIRST N ROWS(Oracle) 등과 결합해 상위 N개만 추출 가능

이로써 데이터 조회 시 가장 많이 사용되는 SELECT-FROM-WHERE-GROUP BY-HAVING-ORDER BY 흐름이 어느 정도 마무리됩니다.

0개의 댓글