SQL/SQLD

#13 ORDER BY

sundori 2025. 4. 13. 13:36

목차

    ORDER BY 절

    ORDER BY는 SELECT 문의 결과를 정렬할 때 사용하는 절이다.  지정한 컬럼(또는 표현식)을 기준으로 오름차순(ASC) 또는 내림차순( DESC) 정렬이 가능하다.

    책에서는 뭐 논리적으로 맨 마지막으로 수행된다하는데 왜 말을 그렇게 어렵게 적는지 모르겠다. 그냥 결과 나오기 전에 정렬할 때 사용한다 하면 쉽게 이해가 더 가지 않을가 생각이 된다.

    뭐 논리적 순서상 마지막이라고 하는 이유는 SQL 문장은 우리가 위에서 아래로 작성하지만, DBMS는 논리적 실행 순서에 따라 밑에 처럼 처리한다.

    SELECT
    FROM
    WHERE
    GROUP BY
    HAVING
    ORDER BY ← ❗ 여기서 마지막

     

    실제로 실행 순서를 보면 밑과 같다.

    SELECT     -> 5
    FROM       -> 1
    WHERE      -> 2
    GROUP BY   -> 3
    HAVING     -> 4
    ORDER BY   -> 6

    SELECT는 제일 먼저 작성하지만, 거의 마지막에 실행이 된다.

    FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY

    이 흐름을 기억하면 WHERE에서는 집계 함수 못 쓰고, HAVING에서는 쓸 수 있는 이유도 쉽게 이해될 것이다.

    순서 설명
    1 FROM 데이터를 가져올 테이블, 뷰, 서브쿼리, 조인 대상 등을 지정한다.
    2 WHERE 가져온 데이터의 각 행(Row)에 조건을 적용해 필터링한다. 조건을 만족하는 행만 다음 단계로 넘어간다.
    3 GROUP BY 조건을 만족하는 남은 행들을 특정 컬럼 값을 기준으로 그룹화(묶음) 한다.
    4 HAVING 그룹화된 데이터에 조건을 적용한다. WHERE과 달리 집계 함수 사용 가능
    5 SELECT 최종적으로 조회할 컬럼, 계산식, 별칭 등을 선택한다.
    6 ORDER BY 조회된 결과를 정렬 기준에 따라 오름차순(ASC) 또는 내림차순(DESC)으로 정렬한다.
    7 LIMIT/ OFFSET (MySQL 등) 결과 개수 제한, 페이지 처리 등

     

    이해가 안된다면 꼭 읽어보기

    책만 보기만 해서는 안 되며 왜 이렇게 되는지에 대해 이해를 해야 한다.
    우선 위의 표를 보며 이야기하자면,
    우리가 데이터를 검색할 때 필요한 데이터들, 예를 들어 학생 데이터는 학생 테이블에 있을 것이며,
    학번, 생년월일, 이름, 주소 등 다양한 정보가 담겨 있을 것이다.

    자, 이 상황을 실제 쿼리로 상상해보면 이렇게 된다.

    우리는 먼저 어디에서 데이터를 가져올지 정해야 한다.
    즉, FROM 절을 통해 “학생 테이블”을 대상으로 지정하는 것이다.
    그다음으로는 학생 전체가 아닌 특정 조건을 만족하는 데이터만 보고 싶을 수 있다.
    예를 들어 “20살 이상인 학생만 보고 싶다”면 WHERE age >= 20 같은 조건을 주게 된다.

    필터링된 학생들 중에 반별로 평균 점수를 알고 싶다면,
    이제 GROUP BY 반으로 반 단위로 데이터를 묶는다.
    그 다음, 평균 점수가 60점 이상인 반만 보고 싶다면 HAVING AVG(score) >= 60처럼
    그룹핑된 집계 결과에 조건을 추가하게 된다.

    이렇게 원하는 데이터를 다 골랐다면,
    이제 그중 어떤 컬럼을 보여줄지 SELECT 절로 정하고,
    정렬이 필요하면 ORDER BY로 정렬하며,
    몇 명만 보고 싶다면 LIMIT로 결과 개수를 조정하게 되는 것이다.

     

    이렇게 보면 쉽지 않은가?

    즉, 이 실행 순서의 핵심은 “먼저 어디서 데이터를 가져올지 정하고, 그다음 하나하나 걸러가며, 마지막에 보여주고 정렬한다
    는 아주 단순한 로직이다.

     

    이 순서를 이해하면 왜 WHERE에 AVG() 같은 집계 함수를 쓸 수 없고,
    왜 HAVING에서만 써야 하는지,
    또 SELECT에서 지정하지 않은 컬럼을 ORDER BY에서 써도 괜찮은지까지 자연스럽게 이해가 된다.

     

    추가로 정렬의 기준이 되는 컬럼에 NULL 데이터가 포함되어 있을 경우 DB 종류에 따라 정렬의 위치가 달라지는데 Oracle의 경우에는 NULL을 최댓값으로 취급하기 때문에 오름차순으로 했을 경우 맨 마지막에 위치하게 된다.(MSSQL은 반대) 만약 순서를 변경하고 싶다면 ORDER BY 절에 NULL FIRST, NULL LAST 옵션을 써서 NULL의 정렬상 순서를 변경할 수 있다.

    728x90

    'SQL > SQLD' 카테고리의 다른 글

    #15 서브쿼리(Subquery)  (0) 2025.04.13
    #14 JOIN  (0) 2025.04.13
    #12 GROUP BY, HAVING 절  (0) 2025.04.13
    #11 WHERE 절  (0) 2025.04.10
    #10 함수  (0) 2025.04.10