[SQL] 그룹화한 데이터에 조건주기: HAVING

jul ee·2025년 4월 4일

데이터 성장기

목록 보기
14/139

🖇  HAVING
🖇  WHERE vs HAVING


" 그룹화된 데이터에도 조건을 걸 수 있다! "

SQL을 배우다 보면 GROUP BY를 사용해서 데이터를 분류하고, SUM, AVG, COUNT 등의 집계 함수로 요약하는 과정까지는 쉽게 익숙해질 수 있다.

하지만 여기서 더 나아가,

그룹화된 결과 중 특정 조건을 만족하는 그룹만 필터링하고 싶을 때
바로 HAVING 절이 필요하다.

이 글에서는 HAVING이 필요한 이유와 그 동작 방식,
그리고 마찬가지로 필터링 역할을 하는 WHERE과의 차이점을 정리해 보았다.



🖇  HAVING

작동 순서

SELECT
FROM 
WHERE    -- GROUP BY 이전
GROUP BY
HAVING   -- GROUP BY 이후
ORDER BY 
LIMIT

HAVING은 언제 쓰는가?

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 vs HAVING

두 문법은 필터링을 위한 도구지만 시점과 대상이 다르다.

  • WHERE: 행(row) 단위로 조건 필터링
  • HAVING: 그룹(group) 단위로 조건 필터링

일반적인 WHERE 절에서는 집계함수 사용이 불가능하지만, HAVING은 가능하다.

구분WHEREHAVING
시점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을 사용한다.

사용 상황조건 필터링 대상사용 문법
개별 행 필터링단순 조건 비교WHERE
그룹 조건 필터링집계 결과 비교HAVING


이렇게
GROUP BY, 집계 함수, 그리고 HAVING 을 조합하면

데이터 속에서 패턴을 뽑아내고 의미 있는 인사이트로 연결하는 힘을 기를 수 있을 것이다.

profile
AI에 관심을 가지고, 데이터로 가치를 만들어 나가는 과정을 기록합니다.

0개의 댓글