🖇 HAVING
🖇 WHERE vs HAVING
" 그룹화된 데이터에도 조건을 걸 수 있다! "
SQL을 배우다 보면 GROUP BY를 사용해서 데이터를 분류하고, SUM, AVG, COUNT 등의 집계 함수로 요약하는 과정까지는 쉽게 익숙해질 수 있다.
하지만 여기서 더 나아가,
그룹화된 결과 중 특정 조건을 만족하는 그룹만 필터링하고 싶을 때
바로 HAVING 절이 필요하다.
이 글에서는 HAVING이 필요한 이유와 그 동작 방식,
그리고 마찬가지로 필터링 역할을 하는 WHERE과의 차이점을 정리해 보았다.
작동 순서
SELECT FROM WHERE -- GROUP BY 이전 GROUP BY HAVING -- GROUP BY 이후 ORDER BY LIMIT
HAVING은 그룹화(GROUP BY) 된 결과에 조건을 걸 때 사용한다.
그룹함수를 적용해서 나온 결과 중 원하는 조건에 부합하는 것만 필터링할 수 있다.
HAVING은 집계 이후의 결과를 필터링 해준다.아래의 예제를 통해 살펴보자.
-- 날씨별 이용건수의 합계 중 10만건 이상의 데이터만 확인하기
SELECT weathersit AS "날씨",
SUM(cnt) AS "이용건수합계"
FROM bike
GROUP BY 1
HAVING SUM(cnt) >= 100000
💡 여기서, GROUP BY 1은
SELECT 의 첫 번째 컬럼인 weathersit을 기준으로 그룹화한다는 의미이다.
두 문법은 필터링을 위한 도구지만 시점과 대상이 다르다.
WHERE: 행(row) 단위로 조건 필터링HAVING: 그룹(group) 단위로 조건 필터링일반적인 WHERE 절에서는 집계함수 사용이 불가능하지만, HAVING은 가능하다.
| 구분 | WHERE | HAVING |
|---|---|---|
| 시점 | GROUP BY 이전 | GROUP BY 이후 |
| 대상 | 각 행(row) | 각 그룹(group) |
| 집계함수 사용 | 불가능 | 가능 |
아래의 예제를 통해 어떻게 다르게 동작하는지 살펴보자.
WHERE: 개별 행을 필터링
--- 온도가 0.3 이상인 계절과 온도 데이터 필터링하기
SELECT season AS "계절",
temp AS "온도"
FROM bike
WHERE temp >= 0.3
⇒ WHERE 절에서 조건은 개별 행의 온도값에 직접 적용된다.
HAVING: 그룹을 필터링
-- 계절별 평균 온도(temp)가 0.3 이상인 데이터 필터링하기
SELECT season AS "계절",
AVG(temp) AS "평균온도"
FROM bike
GROUP BY season
HAVING AVG(temp) >= 0.3
⇒ HAVING 절에서 조건은 그룹화된 평균 값에 적용된다.
위에서 예시를 통해 살펴봤듯이
단순히 조건을 비교할 때는 WHERE를 사용하고, 그룹화된 집계 결과를 비교할 때는 HAVING을 사용한다.
| 사용 상황 | 조건 필터링 대상 | 사용 문법 |
|---|---|---|
| 개별 행 필터링 | 단순 조건 비교 | WHERE |
| 그룹 조건 필터링 | 집계 결과 비교 | HAVING |
이렇게
GROUP BY, 집계 함수, 그리고HAVING을 조합하면데이터 속에서 패턴을 뽑아내고 의미 있는 인사이트로 연결하는 힘을 기를 수 있을 것이다.