SQL로 데이터를 조회하다 보면 조건을 걸 때 WHERE 절과 HAVING 절 중 어떤 것을 사용해야 할지 헷갈리는 경우가 많습니다. 두 절 모두 '필터링' 역할을 하지만, 적용 대상과 사용 방식이 분명히 다릅니다. 이 글에서는 두 절의 핵심 차이점을 명확하게 정리해 드립니다.
WHERE 절이란?
WHERE 절은 테이블의 개별 레코드(행)를 특정 조건에 따라 필터링하는 데 사용됩니다. 주요 특징은 다음과 같습니다.
- 특정 조건에 맞는 행만 테이블에서 추출합니다.
- GROUP BY 절 없이도 단독으로 사용할 수 있습니다.
- 행(row) 단위 연산에 적합합니다.
- SUM, COUNT 같은 집계 함수를 포함할 수 없습니다.
- SELECT뿐 아니라 UPDATE, DELETE 문에서도 사용할 수 있습니다.
- GROUP BY 절이 쿼리에 포함된 경우, WHERE 절은 GROUP BY보다 먼저 실행됩니다.
- UPPER, LOWER 등 단일 행 함수와 함께 사용할 수 있습니다.
HAVING 절이란?
HAVING 절은 그룹화된 결과(GROUP BY로 만들어진 그룹)를 특정 조건에 따라 필터링하는 데 사용됩니다. 주요 특징은 다음과 같습니다.
- 그룹 단위로 조건을 적용하여 원하는 그룹만 추출합니다.
- 반드시 GROUP BY 절과 함께 사용해야 합니다.
- 열(column) 연산 기준으로 작동합니다.
- SUM, COUNT 등 집계 함수를 포함할 수 있습니다.
- SELECT 문에서만 사용할 수 있습니다.
- GROUP BY 절 뒤에 위치합니다.
- SUM, COUNT 등 복수 행(집계) 함수와 함께 사용할 수 있습니다.
WHERE vs HAVING 한눈에 비교하기
| 구분 | WHERE 절 | HAVING 절 |
|---|---|---|
| 필터링 대상 | 개별 행(레코드) | 그룹화된 결과 |
| GROUP BY 없이 사용 | 가능 | 불가능 |
| 집계 함수 사용 | 불가능 | 가능 |
| 사용 가능한 문 | SELECT, UPDATE, DELETE | SELECT만 가능 |
| 실행 순서 | GROUP BY 이전 | GROUP BY 이후 |
기본 문법
WHERE 절과 HAVING 절이 함께 사용되는 일반적인 SELECT 문의 구조는 다음과 같습니다.
SELECT column1, column2
FROM table1, table2
WHERE [conditions]
GROUP BY column1, column2
HAVING [conditions]
ORDER BY column1, column2;
실행 순서는 FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY 순입니다. 즉, WHERE 절이 먼저 행을 걸러낸 뒤 그룹화가 진행되고, 마지막으로 HAVING 절이 그룹 단위 조건을 적용합니다. 이 순서를 이해하면 두 절을 언제, 어떻게 사용해야 할지 쉽게 판단할 수 있습니다.