GROUP BY는 행을 그룹으로 묶어 그룹마다 집계함수를 적용하고, HAVING은 그렇게 만들어진 그룹에 조건을 겁니다. 시험은 딱 하나를 집요하게 묻습니다 — "이 조건, WHERE인가 HAVING인가?"
이 단원, 시험에서 어디에 나오나 (출제 비중)
- 제2과목 「SQL 기본 및 활용」 = 40문항 · 80점. GROUP BY·HAVING은 집계 SQL의 실행결과 예측 문제로 꾸준히 나옵니다.
- 특히 WHERE vs HAVING 구분과 "이 SQL은 오류인가?" 유형이 단골입니다. (단원별 문항수는 공개되지 않습니다 — 출처: KDATA 출제기준.)
출제 포인트 — 시험이 실제로 묻는 것
- WHERE = 행 필터(그룹 전), HAVING = 그룹 필터(집계 후) (최다 출제)
- 집계함수는 WHERE에 못 쓰고 HAVING에 쓴다
SELECT의 일반 컬럼이GROUP BY에 없으면 오류- 집계함수는 NULL을 무시하고 계산한다 (함수 단원과 연계)
① 실행 순서 속 위치 — WHERE는 그룹 전, HAVING은 그룹 후
그림 1. WHERE(집계 전)와 HAVING(집계 후)이 작동하는 위치. (자작 도식)
SELECT 부서, COUNT(*) AS 인원, AVG(급여) AS 평균
FROM 사원
WHERE 입사일 >= '2020-01-01' -- ① 그룹 전, 개별 행 필터
GROUP BY 부서 -- ② 부서로 그룹화
HAVING AVG(급여) >= 5000 -- ③ 그룹 후, 집계값 조건
ORDER BY 평균 DESC; -- ④ 정렬
| WHERE | HAVING | |
|---|---|---|
| 대상 | 개별 행 | 그룹(집계값) |
| 시점 | GROUP BY 전 | GROUP BY 후 |
| 집계함수 | ✗ 불가 | ✓ 가능 |
② 구체 예시 — 그룹을 만들고, 집계값으로 거른다
그림 2. 부서별 SUM 집계 후 HAVING으로 그룹을 거른다(인사 탈락). (자작 도식)
HAVING SUM(금액) >= 500은 행이 아니라 "부서별 합계"라는 집계값을 봅니다. 개별 행 금액 500이 아니라 그룹 합계 500이 기준입니다.
③ 함정 — 집계 조건을 WHERE에 쓰면 오류
WHERE AVG(급여) >= 5000 -- ✘ 오류: WHERE는 그룹 생성 전이라 집계값이 없다
HAVING AVG(급여) >= 5000 -- ✔ 집계 조건은 HAVING
판별법: 조건에 집계함수(SUM·AVG·COUNT…)가 들어가면 무조건 HAVING, 개별 컬럼 값이면 WHERE.
반대로 행 조건을 HAVING에 쓰는 것도 함정입니다. "2020년 이후 입사자만 집계"는 그룹을 만들기 전에 걸러야 하므로 WHERE가 맞습니다. HAVING으로 하면 전부 그룹핑한 뒤 거르게 되어 비효율입니다.
④ 함정 — SELECT 컬럼과 GROUP BY의 관계
SELECT 부서, 이름, COUNT(*) -- ✘ 오류: '이름'이 GROUP BY에 없음
FROM 사원
GROUP BY 부서;
그룹당 결과는 한 행인데, 그룹에 없는 일반 컬럼(이름)은 어느 행의 값인지 정할 수 없어 오류입니다. SELECT의 집계함수가 아닌 컬럼은 반드시 GROUP BY에 있어야 합니다.
한 장 정리 (암기 카드)
- WHERE = 행(집계 전) · HAVING = 그룹(집계 후, 집계함수 가능).
- 조건에 집계함수가 보이면 HAVING, 아니면 WHERE.
SELECT일반 컬럼 =GROUP BY필수.- 행 조건은 WHERE로 미리 걸러야 효율↑.
참고 출처
- 시험 과목·배점: 한국데이터산업진흥원(KDATA) 데이터자격검정 (2026년 7월 확인)
- 동작은 ANSI SQL 표준·오라클 SQL에 근거하며, 본문 예시·도식·설명은 자작입니다.