HAVING이란 무엇인가: WHERE와 차이까지 쉽게 이해하기
SQL을 공부하다 보면 HAVING이 꼭 등장합니다. 특히 GROUP BY와 함께 나오기 때문에 처음에는 WHERE와 뭐가 다른지 헷갈리기 쉽습니다. 결론부터 말하면 HAVING은 그룹화된 결과에 조건을 거는 구문이고, WHERE는 그룹화 전에 개별 행에 조건을 거는 구문입니다. 이 글에서는 SQL 초보자와 SQLD 준비생이 헷갈리지 않도록 HAVING의 의미, WHERE와 차이, 예제, 자주 하는 실수까지 한 번에 정리해보겠습니다.
- HAVING이 왜 필요한지 헷갈리는 분
- WHERE와 HAVING 차이를 확실히 정리하고 싶은 분
- GROUP BY 이후 조건 처리 흐름이 잘 안 잡히는 분
- SQLD에서 HAVING 문제를 자주 틀리는 분
HAVING이란 무엇인가
HAVING은 GROUP BY로 묶은 결과에 조건을 거는 구문입니다.
예를 들어 부서별 직원 수를 구한 뒤, 그중 직원 수가 5명 이상인 부서만 보고 싶다고 해보겠습니다. 이때는 먼저 GROUP BY로 부서별로 묶고, 그다음 HAVING으로 조건을 걸어야 합니다.
쉽게 말하면 HAVING은 “묶은 뒤에 거르는 조건”입니다.
왜 HAVING이 필요할까
집계 함수 결과를 기준으로 필터링해야 하는 경우가 있기 때문입니다.
- 부서별 직원 수가 5명 이상인 부서만 보기
- 카테고리별 평균 가격이 1만 원 이상인 경우만 보기
- 회원별 주문 횟수가 3회 이상인 회원만 보기
이런 조건은 개별 행이 아니라 그룹 결과에 대한 조건이므로 WHERE가 아니라 HAVING이 필요합니다.
가장 기본적인 예제
부서별 직원 수를 구한 뒤, 직원 수가 5명 이상인 부서만 조회하는 쿼리는 아래처럼 작성할 수 있습니다.
SELECT department_id, COUNT(*) AS cnt
FROM employees
GROUP BY department_id
HAVING COUNT(*) >= 5;
이 쿼리는 아래 흐름으로 이해하면 쉽습니다.
- employees 테이블을 department_id 기준으로 묶는다
- 각 그룹의 직원 수를 COUNT(*)로 계산한다
- 그 결과가 5 이상인 그룹만 남긴다
WHERE와 HAVING 차이는 무엇인가
초보자가 가장 많이 헷갈리는 포인트가 바로 이것입니다.
WHERE는 그룹화 전에 행을 거르고, HAVING은 그룹화 후 결과를 거릅니다.
즉, WHERE는 개별 행 기준이고, HAVING은 집계 결과 기준이라고 이해하면 됩니다.
| 구분 | WHERE | HAVING |
|---|---|---|
| 적용 시점 | GROUP BY 전 | GROUP BY 후 |
| 대상 | 개별 행 | 그룹 결과 |
| 주로 쓰는 조건 | 일반 컬럼 조건 | 집계 함수 조건 |
WHERE와 HAVING을 함께 쓰는 경우
실제 쿼리에서는 WHERE와 HAVING을 같이 쓰는 경우도 많습니다.
예를 들어 2024년 이후 입사자만 대상으로 부서별 직원 수를 구하고, 그중 3명 이상인 부서만 보고 싶다면 아래처럼 작성할 수 있습니다.
SELECT department_id, COUNT(*) AS cnt
FROM employees
WHERE hire_year >= 2024
GROUP BY department_id
HAVING COUNT(*) >= 3;
이 쿼리는 아래처럼 이해하면 됩니다.
- WHERE로 2024년 이후 입사자만 먼저 걸러낸다
- GROUP BY로 부서별로 묶는다
- HAVING으로 3명 이상인 부서만 남긴다
HAVING에는 왜 집계 함수가 자주 나올까
HAVING은 그룹 결과를 대상으로 하기 때문에 COUNT, SUM, AVG 같은 집계 함수와 함께 자주 사용됩니다.
예를 들면 아래처럼 쓸 수 있습니다.
- HAVING COUNT(*) >= 5
- HAVING SUM(amount) >= 100000
- HAVING AVG(score) >= 80
즉, HAVING은 “그룹별 계산 결과가 어떤 조건을 만족하는가”를 보는 구문이라고 생각하면 됩니다.
초보자가 자주 하는 실수
집계 함수 조건을 WHERE에 넣는 것
예를 들어 COUNT(*) >= 5 같은 조건은 보통 WHERE가 아니라 HAVING에 넣어야 합니다.
HAVING이 WHERE를 완전히 대신한다고 생각하는 것
HAVING은 그룹 결과 필터링용이고, 개별 행 조건은 여전히 WHERE가 더 적절합니다.
GROUP BY 없이 HAVING을 이해하려는 것
HAVING은 GROUP BY와 함께 이해해야 훨씬 쉽습니다. “묶은 뒤에 조건”이라는 흐름을 같이 기억해야 합니다.
비전공자는 이렇게 외우면 쉽다
- WHERE = 먼저 거르기
- GROUP BY = 묶기
- HAVING = 묶은 뒤 거르기
- 이 순서로 외우면 SQL 실행 흐름이 같이 정리됩니다.
핵심 요약
- HAVING은 GROUP BY로 묶은 결과에 조건을 거는 구문입니다.
- WHERE는 그룹화 전 행 조건, HAVING은 그룹화 후 그룹 조건입니다.
- COUNT, SUM, AVG 같은 집계 함수와 함께 자주 사용됩니다.
- WHERE와 HAVING은 서로 대체 관계가 아니라 역할이 다릅니다.
- “먼저 WHERE, 그다음 GROUP BY, 마지막에 HAVING” 흐름으로 이해하면 쉽습니다.
FAQ
HAVING은 왜 필요한가요?
집계 결과에 조건을 걸어야 하는 경우가 있기 때문입니다. 예를 들어 그룹별 개수나 평균을 기준으로 필터링할 때 필요합니다.
WHERE와 HAVING 차이는 무엇인가요?
WHERE는 그룹화 전에 개별 행을 거르고, HAVING은 그룹화 후 그룹 결과를 거릅니다.
HAVING에는 집계 함수만 써야 하나요?
주로 집계 함수 조건에 많이 쓰지만, 핵심은 그룹 결과에 대한 조건이라는 점입니다.
HAVING 없이도 그룹 조회가 가능한가요?
가능합니다. 단순히 그룹별 집계만 보고 싶다면 GROUP BY만 써도 됩니다. HAVING은 그 결과를 한 번 더 걸러낼 때 필요합니다.
SQLD에서도 HAVING이 자주 나오나요?
네. GROUP BY, 집계 함수, WHERE와의 차이와 함께 매우 자주 출제되는 핵심 개념입니다.
'자격증 준비 > SQLD' 카테고리의 다른 글
| ORDER BY란 무엇인가: 오름차순, 내림차순 쉽게 이해하기 (0) | 2026.03.15 |
|---|---|
| NULL이란 무엇인가: 0, 공백과 차이까지 쉽게 이해하기 (0) | 2026.03.15 |
| GROUP BY란 무엇인가: SQL 초보자도 이해하는 그룹화 개념 정리 (0) | 2026.03.14 |
| 집계 함수란 무엇인가: COUNT, SUM, AVG 쉽게 이해하기 (0) | 2026.03.14 |
| 서브쿼리란 무엇인가: SQL 초보자도 이해하는 개념과 종류 정리 (0) | 2026.03.13 |