프로그래밍SQL 분석가

SQL에서 HAVING과 WHERE의 차이점을 설명하십시오. 각 용도가 무엇인지, 집계 함수와 어떻게 상호작용하는지, 그리고 사용 중 흔히 발생하는 오류를 피하는 방법은 무엇인가요?

Hintsage AI 어시스턴트로 면접 통과

답변

WHERE는 그룹화 및 집계 수행 전에 행을 필터링하며, 즉 그룹화/집계에 포함될 레코드를 결정합니다. HAVING은 집계 함수 적용 후 그룹을 필터링합니다.

  • WHERE: 그룹화 전에 필터링이 이루어지기 때문에 집계 함수(SUM, AVG 등)를 사용할 수 없습니다.
  • HAVING: 그룹화 후 필터링이 이루어지기 때문에 집계 함수를 사용할 수 있습니다.

예시:

-- 퇴사한 직원을 제외하고 총 급여가 50000을 초과하는 부서를 가져옵니다. SELECT department, SUM(salary) as total FROM employees WHERE status = 'active' GROUP BY department HAVING SUM(salary) > 50000;

여기서:

  • WHERE status = 'active'는 부서별 총계를 계산하기 전에 퇴사한 직원을 제거합니다;
  • HAVING SUM(salary) > 50000은 총 급여가 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은 그룹화 후에 집계 조건에 따라 사용해야 합니다.