집계입문

HAVING

GROUP BY로 묶은 그룹에 조건을 거는 절

정의

GROUP BY로 그룹을 만든 다음, 그 그룹에 조건을 걸어 거른다. WHERE는 묶기 전의 행을 거르고, HAVING은 묶은 후의 그룹을 거른다. 예: "HAVING COUNT(*) >= 3" 이라고 하면 인원이 3명 이상인 부서만 결과에 나온다. WHERE에는 COUNT 같은 집계 함수를 못 쓰고, 그룹 단위 조건은 모두 HAVING에 써야 한다.

왜 중요한가?

"3번 이상 주문한 고객만 보기" 같은 조건은 HAVING의 영역. WHERECOUNT(*) > 3을 쓰면 에러(ORA-00934)가 난다. WHERE는 행 하나하나의 조건, HAVING은 묶인 그룹의 조건 — 이 차이가 GROUP BY를 쓸 때 가장 흔한 헷갈림이다.

틀리기 쉬운 포인트

  • !WHERE에 집계 함수를 쓰면 오류가 발생합니다. WHERE COUNT(*) > 3은 안 되고, HAVING COUNT(*) > 3으로 써야 합니다.
  • !HAVING은 GROUP BY 없이도 사용 가능하지만, 이 경우 전체 테이블이 하나의 그룹이 됩니다.
  • !HAVING에서 SELECT 별칭을 사용할 수 있는지는 DB마다 다릅니다. 오라클은 불가, MySQL은 가능. 안전하게 집계 함수를 직접 쓰세요.

예시

SELECT department_id, COUNT(*) AS cnt
FROM employees
GROUP BY department_id
HAVING COUNT(*) >= 3;

성능 포인트

!행 단위 조건은 WHERE에 두어 그룹화 대상을 먼저 줄여라. HAVING은 그룹 단위 조건 전용으로 한정하면 집계 비용이 줄어든다.

관련 개념

관련 문제 풀어보기

관련 카테고리