HAVING의 비밀

jjin
Learn From Data
Published in
2 min readOct 20, 2020

HAVING을 걸 때는 순수한 column 을!

오늘 아침 코드리뷰 스터디에서 GROUP BY에 대한 새로운 비밀을 알아냈다.

두괄식으로 말하면, HAVING 이후 조건을 거는 column은 추가적인 COMMAND가 가미되지 않은 아닌 순수한 column명을 그대로 써줘야한다.

이게 무슨 말인가 함은, 아래 코드를 살펴보자

SELECT HOUR(datetime), COUNT(animal_id) -- 시간대 별 보호소에 온 동물 수
FROM animal_out
GROUP BY HOUR(datetime) -- 보호소에 온 시간으로 GROUP BY
HAVING HOUR(datetime), BETWEEN 9 AND 19 -- 시간을 9시~19시로 선별
ORDER BY HOUR(datetime) -- 시간 순서대로 결과 출력

그리고 이 코드는 실행하면 아래와 같은 메시지와 함께 에러가 난다.

SQL 실행 중 오류가 발생하였습니다.
Unknown column ‘datetime’ in ‘having clause’

HOUR(datetime)은 datetime에서 HOUR만을 뽑아주는 COMMAND가 가미된 column이다. 따라서 column 이름을 알 수 없다는 에러메시지가 출력되는 것이다.

대신 아래처럼 HOUR(datetime)에 새로운 column 명을 alias로 붙여주면 이 문제는 해결된다.

SELECT HOUR(datetime) AS h, COUNT(animal_id) -- HOUR(datetime)에 h라는 새 이름 할당 + 시간대별 보호소에 들어온 동물 수 
FROM animal_out
GROUP BY h -- h로 GROUP BY(h 대신 HOUR(datetime)으로 써도 동작)
HAVING h, BETWEEN 9 AND 19 -- h column을 선택하고 시간을 9시~19시로 선별
ORDER BY HOUR(datetime) -- 시간 순서대로 결과 출력

새로운 깨달음이 있어 뿌듯했던 아침😁

--

--