[SQLD] 05. ORDER BY 절

TJK·2025년 7월 24일

ORDER BY 절 - 결과 정렬

ORDER BY 절은 SELECT 문으로 조회된 결과의 정렬 순서를 지정하는 역할을 함. SQL 쿼리 문장의 가장 마지막에 위치하며, 최종적으로 사용자에게 보여질 데이터의 순서를 결정함.


1. 기본 정렬

  • ASC (Ascending): 오름차순 정렬. 작은 값에서 큰 값 순서로 정렬됨.
    • 숫자: 1, 2, 3 ...
    • 문자: 'A', 'B', 'C' ... (알파벳순) / '가', '나', '다' ... (가나다순)
    • 날짜: 과거부터 현재 순
  • DESC (Descending): 내림차순 정렬. 큰 값에서 작은 값 순서로 정렬됨.
  • ORDER BY 절에서 정렬 방식을 명시하지 않으면 ASC가 기본값으로 적용됨.
/*
 * -- 기본 정렬 예시 --
 * User 테이블의 사용자를 가입일(registration_date)이 최신인 순서부터(내림차순) 조회함.
 */
SELECT
    name,
    registration_date
FROM
    User
ORDER BY
    registration_date DESC;

/*
 * -- 오름차순 정렬 예시 (ASC 생략) --
 * User 테이블의 사용자를 이름(name) 기준 오름차순으로 조회함.
 * ASC는 기본값이므로 생략 가능함.
 */
SELECT
    name,
    registration_date
FROM
    User
ORDER BY
    name; -- name ASC 와 동일

2. 다중 기준 정렬

  • 쉼표(,)를 사용하여 여러 개의 정렬 기준을 지정할 수 있음.
  • 정렬은 명시된 순서대로 진행됨. 즉, 첫 번째 기준으로 정렬 후, 값이 동일한 행에 대해서만 두 번째 기준으로 다시 정렬됨.
/*
 * -- 다중 정렬 예시 --
 * 1차적으로 post_type(게시물 종류) 오름차순으로 정렬하고,
 * post_type이 같은 게시물 내에서는 creation_date(작성일) 내림차순(최신순)으로 정렬함.
 */
SELECT
    post_id,
    post_type,
    creation_date
FROM
    Post
ORDER BY
    post_type ASC,      -- 1차 정렬 기준
    creation_date DESC; -- 2차 정렬 기준

3. 고급 정렬 기법

3.1. 별칭(Alias) 사용

  • SELECT 절에서 정의한 별칭(Alias)ORDER BY 절의 정렬 기준으로 사용할 수 있음.
  • 복잡한 함수나 표현식을 ORDER BY 절에 다시 작성할 필요가 없어 코드가 간결해짐.
/*
 * -- 별칭을 이용한 정렬 --
 * 사용자별 게시물 수를 계산하여 'post_count'라는 별칭을 부여하고,
 * 이 별칭을 기준으로 내림차순 정렬함.
 */
SELECT
    user_id,
    COUNT(*) AS post_count
FROM
    Post
GROUP BY
    user_id
ORDER BY
    post_count DESC;

3.2. 컬럼 위치 번호 사용

  • SELECT 절에 나열된 컬럼의 위치 번호(1부터 시작)를 정렬 기준으로 사용할 수 있음.
/*
 * -- 컬럼 위치 번호를 이용한 정렬 --
 * SELECT 절의 세 번째 컬럼인 registration_date를 기준으로 내림차순 정렬함.
 */
SELECT
    name,               -- 1번 컬럼
    email,              -- 2번 컬럼
    registration_date   -- 3번 컬럼
FROM
    User
ORDER BY
    3 DESC;

※ 주의사항: 컬럼 위치 번호를 사용하는 것은 편리하지만, SELECT 절의 컬럼 순서가 변경되면 의도치 않은 기준으로 정렬될 수 있어 유지보수가 어려움. 가독성과 안정성을 위해 컬럼명이나 별칭을 사용하는 것이 권장됨.

3.3. CASE 표현식을 이용한 조건부 정렬

  • ORDER BY 절에 CASE 표현식을 사용하여 사용자 정의 정렬 규칙을 만들 수 있음.
  • 특정 조건을 만족하는 데이터를 우선적으로 정렬할 때 매우 유용함.
/*
 * -- CASE 표현식을 이용한 조건부 정렬 --
 * user_id가 21인 사용자의 게시물을 최우선(1순위)으로 정렬하고,
 * 나머지 게시물(2순위)을 그 뒤에 정렬함.
 * 각 순위 내에서는 작성일(creation_date)이 최신인 순서로 정렬함.
 */
SELECT
    post_id,
    user_id,
    creation_date
FROM
    Post
ORDER BY
    CASE
        WHEN user_id = 21 THEN 1 -- 21번 유저에게 1순위 부여
        ELSE 2                   -- 나머지 유저에게 2순위 부여
    END,                         -- 1차 정렬 기준
    creation_date DESC;          -- 2차 정렬 기준

4. NULL 값의 정렬 순서

  • ORDER BY 절에서 NULL 값은 DBMS에 따라 다르게 처리됨.
    • Oracle: NULL을 가장 큰 값으로 간주하여, ASC(오름차순)에서는 마지막에, DESC(내림차순)에서는 처음에 정렬됨.
    • MySQL, SQL Server, PostgreSQL: NULL을 가장 작은 값으로 간주하여, ASC에서는 처음에, DESC에서는 마지막에 정렬됨.
  • NULLS FIRST 또는 NULLS LAST 옵션을 사용하여 NULL의 정렬 위치를 명시적으로 지정할 수 있음. (주로 Oracle, PostgreSQL에서 사용)
-- Oracle에서 manager_id가 NULL인 데이터를 가장 먼저 정렬하고, 나머지는 오름차순 정렬
SELECT name, manager_id FROM User ORDER BY manager_id ASC NULLS FIRST;

5. 시험 문제 유형 및 함정 포인트

  • ORDER BY의 실행 순서: ORDER BYSELECT 문에서 가장 마지막에 실행됨. 이 때문에 SELECT 절에서 정의한 Alias를 ORDER BY 절에서 사용할 수 있음. 반면, WHEREGROUP BY에서는 Alias 사용이 불가함. 이 차이점은 단골 출제 포인트임.
  • 기본 정렬 순서: 정렬 방식(ASC/DESC)이 생략된 경우, 기본값인 ASC(오름차순)으로 처리된다는 점을 이용한 문제가 출제됨.
  • 컬럼 위치 번호: SELECT *와 함께 ORDER BY 1과 같이 사용될 경우, 테이블 정의 상의 첫 번째 컬럼을 기준으로 정렬됨을 이해해야 함.
  • NULL 값 정렬: DBMS별 NULL 값 정렬 순서의 차이를 묻거나, NULLS FIRST/LAST 옵션의 기능을 묻는 문제가 나올 수 있음. SQLD는 주로 Oracle 기준을 따르는 경향이 있음.

6. DBMS별 문법 차이

기능OracleMySQLSQL ServerPostgreSQL
NULL 기본 정렬가장 큰 값 (ASC에서 마지막)가장 작은 값 (ASC에서 처음)가장 작은 값 (ASC에서 처음)가장 작은 값 (ASC에서 처음)
NULL 위치 지정NULLS FIRST / NULLS LASTIS NULL을 활용한 CASE문 사용 (ORDER BY column IS NULL, column)IS NULL을 활용한 CASE문 사용NULLS FIRST / NULLS LAST
LIMIT / TOPFETCH FIRST n ROWS ONLYLIMIT nTOP nLIMIT n

※ 실전 팁: 상위 N개 데이터 조회와 정렬은 항상 함께 사용됨. ORDER BY로 정렬한 후, 상위 N개를 가져오는 문법은 DBMS별로 상이하므로, TOP(SQL Server), LIMIT(MySQL), FETCH FIRST(ANSI/Oracle)의 차이를 알아두는 것이 좋음.

profile
Hello world!

0개의 댓글