SELECT절 별칭 참조

SeongGyun Hong·2025년 2월 24일

SQL

목록 보기
43/51

관련문제 https://school.programmers.co.kr/learn/courses/30/lessons/284528

1. SQL SELECT절 별칭 참조

SQL을 작성하다 보면 SELECT 절에서 생성한 별칭(Alias)을 바로 다른 컬럼에서 참조할 수 없는 상황을 자주 겪는다.
이는 SQL의 처리 순서 때문인데, 매번 정리하지만 매번 까먹기 쉬운 것 같다.
따라서 이번 글에서는 이러한 문제를 한번 깊게 다루도록 하겠다.


2. 문제 원인: SQL 처리 순서

SQL 쿼리는 다음과 같은 순서로 실행된다.

  1. FROM: 테이블 결합과 데이터 선택
  2. WHERE: 조건에 따른 행 필터링
  3. GROUP BY: 그룹화
  4. HAVING: 그룹화된 결과에 조건 적용
  5. SELECT: 최종 컬럼 선택 및 별칭(Alias) 부여
  6. ORDER BY: 정렬 수행

SELECT는 5번째 단계에서 수행되므로, SELECT 내에서 정의된 별칭을 같은 SELECT 절에서 바로 참조할 수 없다!

📌 예제: SELECT 절에서 별칭 참조 시 오류

SELECT EMP_NO, SCORE / 2 AS AVG_SCORE,
       CASE
           WHEN AVG_SCORE >= 90 THEN 'A'
           ELSE 'B'
       END AS GRADE
FROM HR_GRADE;

💥 오류: Unknown column 'AVG_SCORE' in 'field list'

이유는 AVG_SCORE가 SELECT 단계에서 생성되었고, 그 시점에서는 다른 컬럼에서 참조할 수 없기 때문.


3. 해결 방법

3.1 서브쿼리 활용 (Subquery)

SELECT EMP_NO, AVG_SCORE,
       CASE
           WHEN AVG_SCORE >= 90 THEN 'A'
           ELSE 'B'
       END AS GRADE
FROM (
    SELECT EMP_NO, SCORE / 2 AS AVG_SCORE
    FROM HR_GRADE
) AS SUB;

장점: 간단하고 직관적. 그냥 프롬절에서 미리 계산하고 이를 SELECT에서 활용하는 방식.
단점: 서브쿼리가 중첩될 때 성능 저하 가능.


3.2 공통 테이블 표현식 (CTE, WITH 절)

WITH CTE_GRADE AS (
    SELECT EMP_NO, SCORE / 2 AS AVG_SCORE
    FROM HR_GRADE
)

SELECT EMP_NO, AVG_SCORE,
       CASE
           WHEN AVG_SCORE >= 90 THEN 'A'
           ELSE 'B'
       END AS GRADE
FROM CTE_GRADE;

장점: 가독성이 높고, 복잡한 로직을 단계적으로 작성 가능.
단점: 일부 DB에서는 최적화가 덜 될 수도 있음.


profile
헤매는 만큼 자기 땅이다.

0개의 댓글