[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 |