WHERE와 HAVING 차이 쉽게 정리: SQL 초보자가 가장 많이 헷갈리는 부분
SQL을 공부하다 보면 WHERE와 HAVING 차이에서 가장 많이 막히는 경우가 많습니다. 둘 다 조건을 거는 것처럼 보이지만, 실제로는 적용 시점과 대상이 다릅니다. 결론부터 말하면 WHERE는 그룹화 전 조건, HAVING은 그룹화 후 조건입니다. 이 글에서는 SQL 초보자도 바로 이해할 수 있도록 WHERE와 HAVING의 차이, 예제, 자주 하는 실수까지 한 번에 정리해보겠습니다.
- WHERE와 HAVING 차이가 항상 헷갈리는 분
- SQLD를 준비 중인 비전공자
- GROUP BY를 배우기 시작한 SQL 초보자
- 문제를 풀 때 조건절 위치를 자주 틀리는 분
WHERE와 HAVING의 차이부터 한 줄로 정리하면
WHERE는 그룹화 전에 개별 행(row)을 걸러내는 조건이고, HAVING은 GROUP BY 이후 그룹 결과를 걸러내는 조건입니다.
이 차이만 정확히 이해하면 SQL 문제에서 헷갈리는 부분이 많이 줄어듭니다. 초보자가 자주 실수하는 이유는 둘 다 “조건”처럼 보이기 때문입니다. 하지만 SQL은 실행 흐름이 있고, 그 흐름 안에서 WHERE와 HAVING의 위치가 다릅니다.
SQLD 공부 순서가 아직 안 잡혔다면 먼저 이전 글을 보고 오셔도 좋습니다.
WHERE는 언제 쓰는가
WHERE는 개별 데이터 행을 먼저 필터링할 때 사용합니다. 즉, 아직 GROUP BY로 묶기 전 단계에서 조건을 거는 것입니다.
SELECT *
FROM employees
WHERE department = '개발팀';
위 쿼리는 employees 테이블에서 부서가 개발팀인 행만 먼저 골라내는 것입니다. 아직 그룹화는 하지 않았고, 행 단위로 조건을 주고 있습니다.
WHERE의 핵심 포인트
- GROUP BY 전에 적용된다
- 개별 행(row)에 조건을 건다
- 집계 함수와 함께 직접 쓰지 않는다
HAVING은 언제 쓰는가
HAVING은 GROUP BY로 묶은 뒤 나온 결과에 조건을 거는 것입니다. 즉, 그룹별 합계, 평균, 개수 같은 집계 결과를 기준으로 필터링할 때 사용합니다.
SELECT department, COUNT(*) AS cnt
FROM employees
GROUP BY department
HAVING COUNT(*) >= 5;
이 쿼리는 부서별로 그룹을 만든 뒤, 인원이 5명 이상인 부서만 남기는 것입니다. 여기서 조건 대상은 개별 행이 아니라 그룹 결과입니다.
HAVING의 핵심 포인트
- GROUP BY 이후에 적용된다
- 그룹 결과에 조건을 건다
- COUNT, SUM, AVG 같은 집계 함수와 함께 자주 사용된다
WHERE와 HAVING 차이를 표로 보면 더 쉽다
| 구분 | WHERE | HAVING |
|---|---|---|
| 적용 시점 | GROUP BY 전 | GROUP BY 후 |
| 대상 | 개별 행(row) | 그룹 결과 |
| 집계 함수 사용 | 보통 사용하지 않음 | 자주 사용함 |
| 주요 용도 | 원본 데이터 필터링 | 집계 결과 필터링 |
예제로 보면 차이가 더 명확하다
예를 들어 주문 테이블이 있다고 가정해보겠습니다.
SELECT *
FROM orders
WHERE amount >= 10000;
금액이 1만 원 이상인 주문 행 자체를 거르는 것입니다.
SELECT customer_id, SUM(amount) AS total_amount
FROM orders
GROUP BY customer_id
HAVING SUM(amount) >= 100000;
이 쿼리는 고객별로 주문 금액을 합친 뒤, 총 주문 금액이 10만 원 이상인 고객만 남기는 것입니다.
초보자가 WHERE와 HAVING에서 자주 하는 실수
집계 함수를 WHERE에 넣는 것
SELECT department, COUNT(*)
FROM employees
WHERE COUNT(*) >= 5
GROUP BY department;
이런 형태는 잘못된 경우가 많습니다. COUNT(*)는 그룹화 후 계산되는 값이므로 WHERE가 아니라 HAVING에서 처리해야 합니다.
행 조건과 그룹 조건을 구분하지 못하는 것
예를 들어 “개발팀 직원만 대상으로 부서별 인원 수를 구하고 싶다”면 먼저 WHERE로 개발팀 직원만 걸러내고, 그다음 GROUP BY를 해야 합니다.
SELECT department, COUNT(*)
FROM employees
WHERE department = '개발팀'
GROUP BY department;
WHERE와 HAVING을 함께 쓰는 경우도 있다
실무나 시험에서는 WHERE와 HAVING이 함께 나오는 경우도 많습니다. 이 경우에는 WHERE로 먼저 행을 줄이고, GROUP BY 후 HAVING으로 그룹을 다시 거른다고 이해하면 쉽습니다.
SELECT department, COUNT(*) AS cnt
FROM employees
WHERE hire_year >= 2024
GROUP BY department
HAVING COUNT(*) >= 3;
위 쿼리는 2024년 이후 입사자만 먼저 골라낸 뒤, 그 안에서 부서별 인원이 3명 이상인 그룹만 남기는 것입니다.
SQL 실행 순서를 같이 보면 WHERE와 HAVING 차이를 더 빨리 이해할 수 있습니다.
헷갈릴 때는 이렇게 외우면 쉽다
- WHERE = 원본 행을 먼저 거른다
- HAVING = 묶은 결과를 나중에 거른다
- 집계 함수가 보이면 HAVING 가능성을 먼저 떠올린다
- GROUP BY 전/후를 항상 같이 생각한다
핵심 요약
- WHERE는 그룹화 전에 개별 행을 걸러내는 조건입니다.
- HAVING은 GROUP BY 이후 그룹 결과를 걸러내는 조건입니다.
- 집계 함수 기준 조건은 HAVING에서 다루는 경우가 많습니다.
- 시험에서는 WHERE와 HAVING을 함께 쓰는 형태도 자주 나옵니다.
FAQ
WHERE와 HAVING 차이는 가장 간단히 어떻게 구분하나요?
WHERE는 행을 거르는 조건, HAVING은 그룹 결과를 거르는 조건이라고 기억하면 가장 쉽습니다.
HAVING 없이 WHERE만 써도 되나요?
개별 행 조건만 필요하다면 가능합니다. 하지만 GROUP BY 후 집계 결과를 기준으로 필터링해야 한다면 HAVING이 필요합니다.
COUNT, SUM 같은 집계 함수는 WHERE에 못 쓰나요?
일반적으로 그룹 결과 기준 조건은 HAVING에서 처리합니다. 초보자는 집계 함수가 나오면 HAVING부터 떠올리는 습관을 들이면 좋습니다.
SQLD 시험에서도 WHERE와 HAVING이 자주 나오나요?
자주 나옵니다. 특히 GROUP BY, 집계 함수, SQL 실행 순서와 함께 연결해서 출제되는 경우가 많습니다.
WHERE와 HAVING을 같이 쓰는 문제는 어떻게 접근하면 되나요?
먼저 WHERE로 행을 줄이고, GROUP BY로 묶고, HAVING으로 그룹 결과를 한 번 더 필터링한다고 생각하면 구조가 잘 보입니다.
'자격증 준비 > SQLD' 카테고리의 다른 글
| PK와 FK 차이 쉽게 이해하기: SQL 초보자가 가장 먼저 알아야 할 개념 (0) | 2026.03.11 |
|---|---|
| SQL 실행 순서 한 번에 이해하기: SELECT문을 읽는 기본 구조 (0) | 2026.03.10 |
| SQLD 독학 순서: 비전공자도 이해되는 공부 루트 정리 (0) | 2026.03.10 |
| [SQLD 이론] 2. 엔터티, 속성, 관계의 개념과 설계 기준 (0) | 2025.03.11 |
| [SQLD 이론] 1. 데이터 모델링의 이해 (0) | 2025.03.11 |