본문 바로가기
Database

MariaDB, MySQL : WHERE 절과 HAVING 절 중 어디에 조건을 걸지?

by 뽀또그링 2023. 3. 7.

 

 

WHERE 절과 HAVING 절 중 어디에 조건을 걸지?

📌 쿼리의 실행 순서 : FROM → WHERE → GROUP BY → SELECT → ORDER BY

💡 조건을 WHERE 절에 적용하는 경우

퍼올린 모든 데이터에 조건을 적용하여 데이터를 가져온 후 그룹화 한다.

💡 조건을 HAVING 절에 적용하는 경우

그룹화 한 다음 조건을 적용한다.

 

 

 

 

프로그래머스 : 자동차 평균 대여 기간 구하기(답ㅇ)

 

 

문제를 분석해보면, 

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서

평균 대여 기간이 7일 이상인 자동차들의

자동차 ID와 평균 대여 기간(컬럼명: AVERAGE_DURATION) 리스트를 출력하는 SQL문을 작성해주세요.

평균 대여 기간은 소수점 두번째 자리에서 반올림하고,

결과는 평균 대여 기간을 기준으로 내림차순 정렬해주시고,

평균 대여 기간이 같으면 자동차 ID를 기준으로 내림차순 정렬해주세요.

조건을 설정할 때, '평균 대여 기간이 7일 이상인 자동차들' 이므로

그룹화 한 다음 조건을 설정해야 합니다.

 

 

 

<WHERE 절에 적용하는 경우(오답)>

SELECT CAR_ID, ROUND(AVG(DATEDIFF(END_DATE, START_DATE))+1, 1) AS AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE DATEDIFF(END_DATE, START_DATE)+1 >= 7
GROUP BY CAR_ID
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC

평균 대여 기간이 아니므로, 사실 이렇게 적용할 일 없겠지만

만약 이렇게 WHERE 절에 대여기간이 7일 이상인 데이터를 퍼올리게 되면

대여 기간이 7일 미만인 데이터가 평균 값 계산에 들어가지 않게 되므로 

오류가 발생합니다.

 

 

 

 

<HAVING 절에 적용하는 경우(정답)>

SELECT CAR_ID, ROUND(AVG(DATEDIFF(END_DATE, START_DATE))+1, 1) AS AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
HAVING AVERAGE_DURATION >= 7
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC