[MySQL] group by 에서 별칭 참조가 가능하다?

2025. 6. 28. 17:19

분명 쿼리 실행 순서는

from, where, (group by), select, (order by)라고 알고 있는데, 어떻게 select 되기 전 group by에서 별칭 참조가 가능할까?

예시 코드:

SELECT 
    CONCAT(CASE WHEN MONTH(DIFFERENTIATION_DATE) <= 3 THEN 1
         WHEN MONTH(DIFFERENTIATION_DATE) <= 6 THEN 2
         WHEN MONTH(DIFFERENTIATION_DATE) <= 9 THEN 3
         ELSE 4
    END,'Q') AS QUARTER,
    COUNT(ID) AS ECOLI_COUNT
FROM ECOLI_DATA
GROUP BY QUARTER
ORDER BY QUARTER

(이 코드는 정상적으로 동작한다.)

 

그 이유는

MySQL은 편의상 GROUP BY '별칭'라고 쓰면
내부에서 GROUP BY '별칭에 해당하는 식'자동 치환하기 때문이다. (다른 DB는 해당 안될 수 있음)

 

위와 같은 경우엔 GROUP BY 'CONCAT CASE WHEN ~ END' 로 치환되는 것이다.

 

그러므로

SELECT 
    CONCAT(CASE WHEN MONTH(DIFFERENTIATION_DATE) <= 3 THEN 1
         WHEN MONTH(DIFFERENTIATION_DATE) <= 6 THEN 2
         WHEN MONTH(DIFFERENTIATION_DATE) <= 9 THEN 3
         ELSE 4
    END,'Q') AS QUARTER,
    COUNT(ID) AS ECOLI_COUNT
FROM ECOLI_DATA
GROUP BY CONCAT(CASE WHEN MONTH(DIFFERENTIATION_DATE) <= 3 THEN 1
         WHEN MONTH(DIFFERENTIATION_DATE) <= 6 THEN 2
         WHEN MONTH(DIFFERENTIATION_DATE) <= 9 THEN 3
         ELSE 4
    END,'Q')
ORDER BY QUARTER

위와 같이 해도 동일한 결과 나온다.

 

즉, 별칭을 인식해서 평가 시점을 바꾸는 게 아니라
별칭을 식으로 “바꿔 끼우고 나머지는 표준 순서대로 실행하는 것 뿐이다.

 

그러면 COUNT(ID) 도 설명 가능하다. (GROUP BY 이후에 정상적으로 실행되는 집계 함수일 뿐)

'Database' 카테고리의 다른 글

[ORACLE] ROWNUM에 대해  (1) 2025.05.01
정규화  (0) 2024.05.15
인덱스(Index)  (0) 2024.02.21
트랜잭션(Transaction)  (0) 2024.02.21
NoSQL  (0) 2024.02.15

BELATED ARTICLES

more