
select date_format(ym, '%Y') as 'YEAR',
round(avg(pm_val1), 2) as "PM10",
round(avg(pm_val2), 2) as "PM2.5"
from air_pollution
where LOCATION2 = '수원'
group by DATE_FORMAT(YM, '%Y')
order by YEAR

SELECT YEAR(YM) AS YEAR,
ROUND(AVG(PM_VAL1),2) AS 'PM10',
ROUND(AVG(PM_VAL2),2) AS 'PM2.5'
FROM AIR_POLLUTION
WHERE LOCATION2 = '수원'
GROUP BY YEAR
ORDER BY YEAR

출력되는 결과는 똑같지만 첫 번재 코드는 테스트에 실패하고 두 번째 코드로 성공할 수 있었다.
그 이유는
YEAR(YM) AS YEAR 와 DATE_FORMAT(YM, '%Y') AS YEAR의 차이점은
반환되는 데이터 타입과 MySQL의 GROUP BY 처리 방식에 있다.
SELECT YEAR(YM) AS YEAR
FROM air_pollution;
YEAR(YM) 함수는 YM(DATE 타입)에서 연도만 추출하여 INT(정수)로 반환한다.YEAR('2024-02-25') → 2024 (정수)YEAR('2019-07-15') → 2019 (정수)✅ YEAR(YM)을 사용할 경우 GROUP BY YEAR가 문제없이 작동하는 이유
YEAR(YM)은 숫자(정수)로 변환되므로, GROUP BY YEAR에서 YEAR이 정수 컬럼처럼 취급된다.ONLY_FULL_GROUP_BY 모드에서도 안정적으로 동작한다.SELECT DATE_FORMAT(YM, '%Y') AS YEAR
FROM air_pollution;
DATE_FORMAT(YM, '%Y') 함수는 연도를 문자열(CHAR(4)) 형태로 반환한다.DATE_FORMAT('2024-02-25', '%Y') → "2024" (문자열)DATE_FORMAT('2019-07-15', '%Y') → "2019" (문자열)⚠ DATE_FORMAT(YM, '%Y')을 사용하면 GROUP BY에서 문제가 발생할 수도 있다.
YEAR(YM)은 정수(INT)를 반환하므로 GROUP BY YEAR가 자연스럽게 적용된다.DATE_FORMAT(YM, '%Y')은 문자열(CHAR(4))을 반환하기 때문에 GROUP BY YEAR에서 문제가 발생할 수도 있다.ORDER BY YEAR에서 숫자 정렬이 더 자연스럽고, 문자열 정렬은 미묘한 차이로 오류가 날 수도 있다.✅ ONLY_FULL_GROUP_BY란?
GROUP BY 절에 포함해야 한다는 규칙을 적용하는 것이다.(YM)을 GROUP BY 없이 사용하면 모호한 데이터가 나올 수 있기 때문에 이를 방지하기 위한 설정이다.