WHERE는 그룹화 및 집계 수행 전에 행을 필터링하며, 즉 그룹화/집계에 포함될 레코드를 결정합니다. HAVING은 집계 함수 적용 후 그룹을 필터링합니다.
예시:
-- 퇴사한 직원을 제외하고 총 급여가 50000을 초과하는 부서를 가져옵니다. SELECT department, SUM(salary) as total FROM employees WHERE status = 'active' GROUP BY department HAVING SUM(salary) > 50000;
여기서:
WHERE에서 집계 함수를 사용할 수 있나요?
오류: WHERE SUM(amount) > 100을 작성하려고 시도하였으나, 그렇지 않습니다 — 집계 함수는 오직 HAVING에서만 적용됩니다.
예시 (잘못됨):
SELECT customer_id, SUM(amount) FROM orders WHERE SUM(amount) > 100 GROUP BY customer_id -- 오류: WHERE에서 SUM()의 잘못된 사용
올바른 예시:
SELECT customer_id, SUM(amount) FROM orders GROUP BY customer_id HAVING SUM(amount) > 100;
이야기
CRM 개발. WHERE를 통해 주문 수 >5를 필터링하려고 시도했지만 COUNT(order_id) > 5가 작동하지 않았습니다. 결과: 보고서의 고객 수가 부정확하게 나왔고, WHERE에서 COUNT를 사용할 수 없었습니다.
이야기
비즈니스 분석. 비활성 제품 필터링을 WHERE가 아닌 HAVING으로 사용했습니다. 결과: "빈" 그룹의 집계 및 느린 SQL. 상태 필터를 WHERE로 옮겨 수정되었습니다.
이야기
복잡한 보고서. GROUP BY 없이 HAVING을 사용하여 개별 행을 필터링했습니다. 일부 DBMS에서는 오류를 유발하고, 다른 DBMS에서는 명확하지 않은 동작을 초래합니다. 결론: HAVING은 그룹화 후에 집계 조건에 따라 사용해야 합니다.