SQL WHERE와 HAVING 차이 정리 | 원본 데이터 필터와 집계 결과 필터

WHERE와 HAVING은 둘 다 “조건 필터”지만, 필터를 거는 대상이 완전히 다르다. 간단히 정리하면 WHERE는 원본 데이터 기준 필터, HAVING은 GROUP BY 이후 집계 결과 기준 필터다.


WHERE와 HAVING이 헷갈리는 이유

둘 다 조건을 쓰는 문법이라 비슷해 보이지만, 실행 시점이 다르다.

WHERE → 데이터 묶기 전에 필터
HAVING → 데이터 묶은 후 결과 필터

이 차이를 모르면 잘못된 쿼리가 만들어진다.


WHERE의 역할

WHERE는 테이블에 저장된 원본 데이터 자체를 필터링한다.

select *
from usertbl
where addr = '서울';

👉 의미

서울에 사는 사용자만 조회

즉, GROUP BY와 관계없이 기존 컬럼 값 기준으로 필터링한다.


HAVING의 역할

HAVING은 GROUP BY 이후 만들어진 집계 결과를 필터링한다.

select userid, sum(price * amount) as `누적금액`
from buytbl
group by userid
having sum(price * amount) >= 1000;

👉 의미

총 구매금액이 1000 이상인 사용자만 조회

여기서 중요한 점:

누적금액은 원래 테이블에 없는 값
→ SUM으로 만든 값
→ WHERE에서는 사용 불가

WHERE vs HAVING 핵심 차이

구분 WHERE HAVING

대상 원본 데이터 집계 결과
시점 GROUP BY 이전 GROUP BY 이후
사용 컬럼 실제 컬럼 집계 함수 결과

잘못된 코드 vs 올바른 코드

❌ 잘못된 예시

select userid, sum(price * amount) as `누적금액`
from buytbl
group by userid
where `누적금액` >= 1000;

👉 오류 이유

누적금액은 SELECT에서 만든 값이라 WHERE에서 인식 불가


✅ 올바른 코드

select userid, sum(price * amount) as `누적금액`
from buytbl
group by userid
having sum(price * amount) >= 1000;

SQL 작성 순서

SQL은 작성 순서와 실행 순서가 다르다.

작성 순서

select 컬럼
from 테이블
where 조건
group by 기준
having 조건
order by 정렬
limit 개수;

실행 흐름

FROM
→ WHERE
→ GROUP BY
→ HAVING
→ SELECT
→ ORDER BY
→ LIMIT

👉 핵심

  • WHERE → 먼저 필터링
  • GROUP BY → 묶기
  • HAVING → 묶은 결과 필터

WHERE와 HAVING 같이 쓰기

둘은 동시에 사용할 수 있다.

select userid, sum(price * amount) as `누적금액`
from buytbl
where price >= 100
group by userid
having sum(price * amount) >= 1000;

👉 의미

  • WHERE → 원본 데이터 필터
  • HAVING → 집계 결과 필터

실전 기준으로 정리

WHERE → 개별 데이터 필터
HAVING → 그룹 결과 필터

이 기준으로 생각하면 헷갈리지 않는다.


WHERE는 원본 데이터 기준 필터이고, HAVING은 GROUP BY 이후 집계 결과를 필터링할 때 사용한다.