
핵심 요약
집계 함수(SUM, AVG, COUNT 등)를 WHERE 절에서는 사용할 수 없습니다. 이유는 WHERE 절이 ‘개별 행(레코드)‘을 먼저 필터링하고, 집계 함수는 ‘그룹 전체 또는 전체 데이터’가 모인 나중 단계에서 계산되기 때문입니다. 즉, 집계를 하려면 이미 ‘필터링 → 그룹화 → 집계’ 단계가 끝난 뒤라야 집계 함수가 의미가 있습니다.
왜 못 쓰는지? (실행 순서 설명)
- SQL 쿼리의 실행 순서
- FROM (데이터 소스 선택)
- WHERE (개별 행 필터링)
- GROUP BY (그룹화)
- 집계 함수 실행(SUM, AVG 등)
- HAVING (집계된 그룹 필터링)
- SELECT
- ORDER BY
- WHERE 절은 그룹화/집계 전에 적용 → 오직 각 행에만 접근 가능
- 집계 함수는 그룹 전체에 대해 계산 → 그룹화 이후에만 사용 가능
따라서, WHERE 안에서 SUM, AVG 등 집계식은 사용할 수 없음.1234567
(잘못된 예시)
-- 이런 쿼리는 에러남!
SELECT name
FROM employee
WHERE SUM(salary) > 1000; -- (❌ 에러 발생!)
이유: WHERE는 개별 행만 볼 수 있어서, salary의 합계(SUM)는 아직 계산되지 않았음.841
(정상적인 방법: HAVING 절 사용)
집계된 값으로 필터하고 싶으면 HAVING 절을 써야 함!
-- 각 직원 이름별로 salary 합계가 1,000 초과인 경우만 추출
SELECT name, SUM(salary)
FROM employee
GROUP BY name
HAVING SUM(salary) > 1000; -- (⭕ 정상 동작!)
(쉬운 비유)
- WHERE: 걸러준 다음에 합계나 평균을 사칙연산하는 역할 (학생 한명 한명 뽑는단 느낌)
- HAVING: 와! 다 모아서 점수를 합친 다음에, 특정 조건 넘는 학생끼리만 또 뽑는 것
(자주 묻는 질문 요약)
구분 | 역할 | 집계 함수 可/불가 | 사용 예시 |
---|---|---|---|
WHERE | 개별 행 필터 | ❌ (불가) | WHERE age > 20 |
HAVING | 그룹/집계 결과에 조건 부여 | ⭕ (가능) | HAVING SUM(salary) > 1000 |
추가 예시
WHERE 사용 (행 필터링)
SELECT *
FROM students
WHERE score > 80;
→ 각 행의 점수가 80 초과인 학생만 선택 (집계함수 X)
HAVING 사용 (집계 필터링)
SELECT class, AVG(score)
FROM students
GROUP BY class
HAVING AVG(score) > 85;
→ 각 반(class)별 평균점수가 85점 넘는 반만 추출 (집계함수 O).694
정리:
- “WHERE 절”은 행별로, “HAVING 절”은 집계된 값에 대해 사용
- 그래서 집계 함수는 HAVING에서 써야 결과가 정상적으로 나옵니다.
- 위의 예시처럼 둘의 역할이 다르니 구분해서 사용하세요! WHERE
Footnotes
-
https://stackoverflow.com/questions/42470849/why-are-aggregate-functions-not-allowed-in-where-clause ↩ ↩2 ↩3
-
https://www.reddit.com/r/SQL/comments/1f0zroq/aggregate_function_in_where_clause/ ↩
-
https://learn.microsoft.com/en-us/answers/questions/4766531/cannot-have-aggregate-function-in-where-clause ↩
-
https://www.geeksforgeeks.org/sql/having-vs-where-clause-in-sql/ ↩ ↩2 ↩3 ↩4
-
https://learnsql.com/blog/aggregate-functions-in-where-clause/ ↩
-
https://www.reddit.com/r/SQL/comments/o3jeis/having_and_where_difference/ ↩
-
https://www.c-sharpcorner.com/article/sql-not-using-aggregate-function-in-where-clause-instead-using-having-clause/ ↩
-
https://www.owox.com/blog/articles/bigquery-sql-where-vs-having-vs-qualify ↩