본문 바로가기
● Data Insights/SQL

SELECT부터 ORDER BY까지: 읽기와 실행 순서 가이드

by DATA Canvas 2025. 11. 1.
반응형

SQL 쿼리를 작성하거나 읽을 때, 사람이 이해하기 좋은 논리적 순서(작성·읽기 순서)와 실제 데이터베이스 엔진이 처리하는 물리적 순서(실행 순서)는 다릅니다. 이 글에서는 주요 키워드별 기능과 함께 두 가지 순서를 명확히 정리하고, 다양한 예시 쿼리를 통해 읽기·처리 과정을 단계별로 설명합니다.


1. SQL 핵심 키워드와 역할

  • SELECT: 결과로 출력할 컬럼(또는 계산 결과)을 지정
  • FROM: 조회할 테이블(또는 서브쿼리, 조인)을 지정
  • WHERE: 행(Row) 단위 필터링 조건 지정
  • GROUP BY: 특정 컬럼별로 그룹화하여 집계함수 적용
  • HAVING: 그룹화된 결과에 대한 필터링 조건 지정
  • ORDER BY: 최종 결과의 정렬 기준 지정
  • UNION / UNION ALL: 둘 이상의 SELECT 결과를 위아래로 합침
  • JOIN: 두 개 이상의 테이블을 결합하여 결과 생성
  • TOP / OFFSET-FETCH: 결과 행 수를 제한하거나 페이징 처리
반응형

2. 사람이 읽기 좋은 논리적 순서

일반적으로 SQL 문을 작성할 때, 다음과 같은 흐름으로 코드를 구성하면 가독성이 높아집니다.

  1. SELECT: 어떤 데이터를 최종으로 볼 것인지 정의
  2. FROM: 데이터를 가져올 출처(테이블) 지정
  3. JOIN: 필요한 경우 결합 방식과 조건 정의
  4. WHERE: 개별 행 필터링
  5. GROUP BY: 그룹화 기준 지정
  6. HAVING: 그룹화 후 필터링
  7. UNION: 여러 SELECT 결과를 합칠 때
  8. ORDER BY: 최종 결과 정렬
  9. OFFSET-FETCH / TOP: 페이징 또는 개수 제한

이 순서는 읽는 사람이 “어떤 데이터를, 어디서, 어떻게 가공해서 보여줄 것인가”의 흐름을 직관적으로 이해하도록 돕습니다.


3. 실제 서버 처리 순서(실행 순서)

실제로 SQL 엔진은 내부적으로 다음 순서로 처리합니다.

  1. FROM: 테이블·서브쿼리·조인 수행
  2. WHERE: 개별 행 필터링
  3. GROUP BY: 그룹화
  4. HAVING: 그룹화된 결과 필터링
  5. SELECT: 컬럼·계산식 평가
  6. UNION: 여러 SELECT 결과 결합
  7. ORDER BY: 정렬
  8. OFFSET-FETCH / TOP: 결과 제한

이 순서대로 처리하며, 옵티마이저가 내부적으로 더 효율적인 실행 계획(인덱스 스캔·병합 조인·해시 조인 등)으로 바꿔 실행합니다.


4. 기능별 상세 설명

4.1 FROM

  • 테이블 또는 뷰에서 데이터를 가져옴
  • 서브쿼리, CTE(Common Table Expression)도 FROM 절에서 평가

4.2 WHERE

  • FROM 절로부터 생성된 각 행에 대해 조건 검사
  • 조건을 만족하는 행만 다음 단계로 전달

4.3 GROUP BY

  • WHERE 필터링 후 남은 행을 지정 컬럼 기준으로 묶음
  • 집계함수( SUM, COUNT, AVG, MIN, MAX 등 )를 적용할 수 있도록 준비

4.4 HAVING

  • GROUP BY로 묶인 그룹 단위로 조건 검사
  • 예: 그룹 내 합계가 특정 값 이상인 그룹만 남김

4.5 SELECT

  • 최종 출력할 컬럼이나 계산식을 평가
  • 별칭(Alias) 지정으로 가독성 강화

4.6 UNION / UNION ALL

  • 서로 다른 SELECT 결과를 위아래로 합침
  • UNION ALL은 중복 허용, UNION은 중복 제거

4.7 ORDER BY

  • 최종 결과를 지정한 컬럼 기준으로 오름차순(ASC)·내림차순(DESC) 정렬

4.8 OFFSET-FETCH / TOP

  • ORDER BY 후에 결과 행을 건너뛰거나 제한
  • 페이징 구현 시 자주 사용

5. 예시 1: 단순 조회 + 정렬

SELECT ProductName, Price
FROM Products
WHERE Price >= 10000
ORDER BY Price DESC;
  • 사람이 읽는 순서
    1. 어떤 컬럼을 볼지(SELECT ProductName, Price)
    2. 어떤 테이블에서(FROM Products)
    3. 조건은(WHERE Price>=10000)
    4. 결과 정렬(ORDER BY Price DESC)
  • 실제 처리 순서
    1. Products 테이블 읽기
    2. Price>=10000 필터링
    3. SELECT로 ProductName·Price 평가
    4. 결과를 Price 내림차순 정렬

6. 예시 2: 그룹화 + 조건

SELECT CategoryID, COUNT(*) AS TotalProducts
FROM Products
WHERE Discontinued = 0
GROUP BY CategoryID
HAVING COUNT(*) > 10
ORDER BY TotalProducts DESC;
  • 사람 순서
    1. SELECT: CategoryID, 개수 집계
    2. FROM: Products
    3. WHERE: 단종되지 않은 상품만
    4. GROUP BY: 카테고리별 그룹화
    5. HAVING: 그룹별 개수가 10 초과
    6. ORDER BY: 개수 기준 내림차순
  • 실제 처리 순서
    1. Products 테이블 읽기
    2. Discontinued=0 필터링
    3. CategoryID 기준 그룹화
    4. 그룹별 COUNT 계산
    5. COUNT>10 필터링
    6. SELECT로 컬럼·집계 평가
    7. TotalProducts 기준 정렬

7. 예시 3: UNION 활용

SELECT CustomerID, OrderDate, TotalAmount
FROM Orders2024
WHERE TotalAmount >= 500
UNION ALL
SELECT CustomerID, OrderDate, TotalAmount
FROM Orders2025
WHERE TotalAmount >= 500
ORDER BY OrderDate;
  • 사람 순서
    1. 첫 번째 쿼리(2024년, 금액>=500)
    2. 두 번째 쿼리(2025년, 금액>=500)
    3. 두 결과 합치기(UNION ALL)
    4. 날짜 순 정렬
  • 실제 처리 순서
    1. Orders2024 읽기 → WHERE 적용 → SELECT 평가
    2. Orders2025 읽기 → WHERE 적용 → SELECT 평가
    3. 두 결과 합치기
    4. ORDER BY OrderDate 적용

8. 읽기와 실행 순서 이해의 중요성

SQL 최적화나 복잡한 쿼리 디버깅 시, 실제 실행 순서를 이해하면 인덱스 활용, 조인 방식, 서브쿼리 성능 등을 파악하기 쉽습니다. 반대로 읽기 순서를 유지하면 코드 가독성이 높아지고 동료와의 협업이 원활해집니다.


9. 결론 및 추천

SQL을 능숙하게 다루려면 논리적 읽기 순서실제 실행 순서를 모두 이해해야 합니다.

  • 코드 작성 시: 사람 순서(SELECT→FROM→WHERE…)로 구조화
  • 성능 튜닝 시: 실제 실행 순서(FROM→WHERE→GROUP BY…)를 기준으로 쿼리 플랜 확인

이 두 관점을 모두 익혀 두면, 복잡한 분석·보고 쿼리를 더 쉽고 빠르게 작성·최적화할 수 있습니다.

반응형