[SQL] WHERE HAVING 차이점

TNT·2026년 4월 5일

mssql

목록 보기
7/9

SQL을 공부하다 보면 데이터를 필터링할 때 사용하는 WHERE와 HAVING이 헷갈릴 때가 많습니다. 둘 다 조건을 거는 역할을 하지만 사용하는 시점과 대상이 완전히 다르다

먼저 이걸 알아야 한다면 SQL의 실행 순서를 알아야한다
데이터베이스는 우리가 쓴 쿼리를 작성된 순서대로 읽지 않는다
SQL의 실행 순서

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

1. WHERE

  1. 테이블의 각 로우(Row) 하나하나에 조건을 겁니다
  2. 집계 함수(SUM, AVG, COUNT 등)를 사용할 수 없습니다
    대표 적인 예시를 하나 들업보자면 가격이 10000원 이상인 상품 조회 쿼리 인경우
SELECT *
FROM Orders
WHERE Price >= 10000;

이런 형태이다 보통 조걸 걸면 나는 대부분 where로 걸어서 보는 편이라서 이게 익숙 한데
집계 하고 조건을 걸어서 볼때 having도 알고 있으면 좋다

2. HAVING

GROUP BY로 묶인 그룹 결과에 조건을 겁니다
주로 집계 함수와 함께 사용된다
예시를 하나 들면 상품 카테고리별 평균 가격을 구했을 때 그 평균이 50000원 이상인 카테고리만 찾을때

SELECT Category, AVG(Price)
FROM Orders
GROUP BY Category
HAVING AVG(Price) >= 50000;

둘다 쓸수있을까 하면 서로 의 특성상 조건이 서로 걸리는데 이하로는 사용해야할 조건이 있다

주의 사항

WHERE 절에서는 집계 함수를 쓸 수 없다

SELECT Category, SUM(Sales)
FROM Orders
WHERE SUM(Sales) > 1000000  -- WHERE에는 SUM을 쓸 수 없음
GROUP BY Category;

SELECT Category, SUM(Sales)
FROM Orders
GROUP BY Category
HAVING SUM(Sales) > 1000000; -- HAVING으로 사용 하자

당연하게도 WHERE은 집계에서 사용을 못한다 HAVING으로 사용해주자

6. 요약

WHERE: 그룹화하기 전에 개별 행을 필터링합니다.
HAVING: 그룹화한 후에 그룹화된 결과를 필터링합니다. (집계 함수와 함께 사용)

성능 최적화 측면에서 보면 가능하다면 WHERE절에서 먼저 데이터를 쳐내는 것이 좋다
WHERE로 불필요한 데이터를 먼저 제거하면 Group By할 데이터 양이 줄어들어 계산이 빨라진다
반면 그룹화된 값 자체에 조건을 걸어야 할 때는(합계, 평균 등) 반드시 HAVING을 사용해야 한다

profile
개발

0개의 댓글