관련문제 https://school.programmers.co.kr/learn/courses/30/lessons/284528
SQL을 작성하다 보면 SELECT 절에서 생성한 별칭(Alias)을 바로 다른 컬럼에서 참조할 수 없는 상황을 자주 겪는다.
이는 SQL의 처리 순서 때문인데, 매번 정리하지만 매번 까먹기 쉬운 것 같다.
따라서 이번 글에서는 이러한 문제를 한번 깊게 다루도록 하겠다.
SQL 쿼리는 다음과 같은 순서로 실행된다.
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 단계에서 생성되었고, 그 시점에서는 다른 컬럼에서 참조할 수 없기 때문.
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에서 활용하는 방식.
단점: 서브쿼리가 중첩될 때 성능 저하 가능.
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에서는 최적화가 덜 될 수도 있음.