SQL을 공부하다 보면 데이터를 필터링할 때 사용하는 WHERE와 HAVING이 헷갈릴 때가 많습니다. 둘 다 조건을 거는 역할을 하지만 사용하는 시점과 대상이 완전히 다르다
먼저 이걸 알아야 한다면 SQL의 실행 순서를 알아야한다
데이터베이스는 우리가 쓴 쿼리를 작성된 순서대로 읽지 않는다
SQL의 실행 순서
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
SELECT *
FROM Orders
WHERE Price >= 10000;
이런 형태이다 보통 조걸 걸면 나는 대부분 where로 걸어서 보는 편이라서 이게 익숙 한데
집계 하고 조건을 걸어서 볼때 having도 알고 있으면 좋다
GROUP BY로 묶인 그룹 결과에 조건을 겁니다
주로 집계 함수와 함께 사용된다
예시를 하나 들면 상품 카테고리별 평균 가격을 구했을 때 그 평균이 50000원 이상인 카테고리만 찾을때
SELECT Category, AVG(Price)
FROM Orders
GROUP BY Category
HAVING AVG(Price) >= 50000;
둘다 쓸수있을까 하면 서로 의 특성상 조건이 서로 걸리는데 이하로는 사용해야할 조건이 있다
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으로 사용해주자
WHERE: 그룹화하기 전에 개별 행을 필터링합니다.
HAVING: 그룹화한 후에 그룹화된 결과를 필터링합니다. (집계 함수와 함께 사용)
성능 최적화 측면에서 보면 가능하다면 WHERE절에서 먼저 데이터를 쳐내는 것이 좋다
WHERE로 불필요한 데이터를 먼저 제거하면 Group By할 데이터 양이 줄어들어 계산이 빨라진다
반면 그룹화된 값 자체에 조건을 걸어야 할 때는(합계, 평균 등) 반드시 HAVING을 사용해야 한다