#2025-08-18 # 집계 함수가 WHERE 절에서 못 쓰는 이유와 쉬운 예시

핵심 요약

집계 함수(SUM, AVG, COUNT 등)를 WHERE 절에서는 사용할 수 없습니다. 이유는 WHERE 절이 ‘개별 행(레코드)‘을 먼저 필터링하고, 집계 함수는 ‘그룹 전체 또는 전체 데이터’가 모인 나중 단계에서 계산되기 때문입니다. 즉, 집계를 하려면 이미 ‘필터링 → 그룹화 → 집계’ 단계가 끝난 뒤라야 집계 함수가 의미가 있습니다.


왜 못 쓰는지? (실행 순서 설명)

  • SQL 쿼리의 실행 순서
  1. FROM (데이터 소스 선택)
  2. WHERE (개별 행 필터링)
  3. GROUP BY (그룹화)
  4. 집계 함수 실행(SUM, AVG 등)
  5. HAVING (집계된 그룹 필터링)
  6. SELECT
  7. 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;  -- (⭕ 정상 동작!)
  • GROUP BY로 이름별 그룹 만들고, 각 그룹의 salary 합계가 1,000 넘으면 결과에 포함.461

(쉬운 비유)

  • 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

  1. https://stackoverflow.com/questions/42470849/why-are-aggregate-functions-not-allowed-in-where-clause 2 3

  2. https://www.reddit.com/r/SQL/comments/1f0zroq/aggregate_function_in_where_clause/

  3. https://learn.microsoft.com/en-us/answers/questions/4766531/cannot-have-aggregate-function-in-where-clause

  4. https://www.geeksforgeeks.org/sql/having-vs-where-clause-in-sql/ 2 3 4

  5. https://learnsql.com/blog/aggregate-functions-in-where-clause/

  6. https://www.beekeeperstudio.io/blog/having-vs-where 2 3

  7. https://www.reddit.com/r/SQL/comments/o3jeis/having_and_where_difference/

  8. https://www.c-sharpcorner.com/article/sql-not-using-aggregate-function-in-where-clause-instead-using-having-clause/

  9. https://www.owox.com/blog/articles/bigquery-sql-where-vs-having-vs-qualify