WHERE와 HAVING은 둘 다 “조건 필터”지만, 필터를 거는 대상이 완전히 다르다. 간단히 정리하면 WHERE는 원본 데이터 기준 필터, HAVING은 GROUP BY 이후 집계 결과 기준 필터다.
WHERE와 HAVING이 헷갈리는 이유
둘 다 조건을 쓰는 문법이라 비슷해 보이지만, 실행 시점이 다르다.
WHERE → 데이터 묶기 전에 필터
HAVING → 데이터 묶은 후 결과 필터
이 차이를 모르면 잘못된 쿼리가 만들어진다.
WHERE의 역할
WHERE는 테이블에 저장된 원본 데이터 자체를 필터링한다.
select *
from usertbl
where addr = '서울';
👉 의미
서울에 사는 사용자만 조회
즉, GROUP BY와 관계없이 기존 컬럼 값 기준으로 필터링한다.
HAVING의 역할
HAVING은 GROUP BY 이후 만들어진 집계 결과를 필터링한다.
select userid, sum(price * amount) as `누적금액`
from buytbl
group by userid
having sum(price * amount) >= 1000;
👉 의미
총 구매금액이 1000 이상인 사용자만 조회
여기서 중요한 점:
누적금액은 원래 테이블에 없는 값
→ SUM으로 만든 값
→ WHERE에서는 사용 불가
WHERE vs HAVING 핵심 차이
구분 WHERE HAVING
| 대상 | 원본 데이터 | 집계 결과 |
| 시점 | GROUP BY 이전 | GROUP BY 이후 |
| 사용 컬럼 | 실제 컬럼 | 집계 함수 결과 |
잘못된 코드 vs 올바른 코드
❌ 잘못된 예시
select userid, sum(price * amount) as `누적금액`
from buytbl
group by userid
where `누적금액` >= 1000;
👉 오류 이유
누적금액은 SELECT에서 만든 값이라 WHERE에서 인식 불가
✅ 올바른 코드
select userid, sum(price * amount) as `누적금액`
from buytbl
group by userid
having sum(price * amount) >= 1000;
SQL 작성 순서
SQL은 작성 순서와 실행 순서가 다르다.
작성 순서
select 컬럼
from 테이블
where 조건
group by 기준
having 조건
order by 정렬
limit 개수;
실행 흐름
FROM
→ WHERE
→ GROUP BY
→ HAVING
→ SELECT
→ ORDER BY
→ LIMIT
👉 핵심
- WHERE → 먼저 필터링
- GROUP BY → 묶기
- HAVING → 묶은 결과 필터
WHERE와 HAVING 같이 쓰기
둘은 동시에 사용할 수 있다.
select userid, sum(price * amount) as `누적금액`
from buytbl
where price >= 100
group by userid
having sum(price * amount) >= 1000;
👉 의미
- WHERE → 원본 데이터 필터
- HAVING → 집계 결과 필터
실전 기준으로 정리
WHERE → 개별 데이터 필터
HAVING → 그룹 결과 필터
이 기준으로 생각하면 헷갈리지 않는다.
WHERE는 원본 데이터 기준 필터이고, HAVING은 GROUP BY 이후 집계 결과를 필터링할 때 사용한다.
'Data Analytics > SQL' 카테고리의 다른 글
| SQL JOIN 정리 | INNER JOIN, LEFT JOIN, RIGHT JOIN 차이 이해하기 (0) | 2026.05.20 |
|---|---|
| SQL ORDER BY와 LIMIT 정리 | 정렬하고 상위 N개 데이터 조회하기 (0) | 2026.05.19 |
| SQL GROUP BY와 집계 함수 정리 | SUM, AVG, COUNT로 데이터 요약하기 (0) | 2026.05.19 |
| SQL 서브쿼리 정리 | 쿼리 안에 쿼리를 넣는 이유와 ANY, ALL 차이 (0) | 2026.05.18 |
| SQL WHERE 조건절 정리 | AND, BETWEEN, IN, LIKE, IS NULL 한 번에 이해하기 (0) | 2026.05.18 |
