[MySQL_Lv2]연도 별 평균 미세먼지 농도 조회하기

박경희·2024년 1월 23일

코딩테스트

목록 보기
28/69

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 YEARDATE_FORMAT(YM, '%Y') AS YEAR의 차이점은
반환되는 데이터 타입과 MySQL의 GROUP BY 처리 방식에 있다.

YEAR(YM) AS YEAR → 숫자(정수, INT) 반환

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이 정수 컬럼처럼 취급된다.
  • 따라서 MySQL의 ONLY_FULL_GROUP_BY 모드에서도 안정적으로 동작한다.

DATE_FORMAT(YM, '%Y') AS YEAR → 문자열(CHAR) 반환

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) AS YEAR가 정답이고, DATE_FORMAT(YM, '%Y')는 틀릴까?

  1. YEAR(YM)은 정수(INT)를 반환하므로 GROUP BY YEAR가 자연스럽게 적용된다.
  2. DATE_FORMAT(YM, '%Y')은 문자열(CHAR(4))을 반환하기 때문에 GROUP BY YEAR에서 문제가 발생할 수도 있다.
  3. ORDER BY YEAR에서 숫자 정렬이 더 자연스럽고, 문자열 정렬은 미묘한 차이로 오류가 날 수도 있다.

ONLY_FULL_GROUP_BY

ONLY_FULL_GROUP_BY란?

  • MySQL 5.7 이상에서 기본적으로 활성화된 SQL 모드로, 모든 비집계 컬럼은 GROUP BY 절에 포함해야 한다는 규칙을 적용하는 것이다.
  • 비집계 컬럼(YM)GROUP BY 없이 사용하면 모호한 데이터가 나올 수 있기 때문에 이를 방지하기 위한 설정이다.

0개의 댓글