본문 바로가기
오라클

[오라클] WHERE 절과 HAVING 절의 차이

by devlog93 2026. 1. 7.

오라클 SQL을 공부하다 보면 WHERE과 HAVING의 차이에어 많이들 헷갈리는 것 같다. 둘 다 조건을 거는 절이라는 공통점이 있어서일까?? 처음 접하게 되면 매우 혼란스럽기 때문에 정리를 해보려고 한다. 두 절은 실행되는 시점과 역할이 완전히 다르다는 것만 기억하면 될 것 같다.


1. WHERE 절이란?

WHERE 절은 데이터를 그룹화하기 전에 행(Row) 단위로 조건을 걸어주는 역할을 한다. 다시 말해 테이블에서 필요 없는 데이터를 미리 걸러내는 필터??라고 생각하면 될 것 같다.

📌중요 포인트

  • WHERE는 GROUP BY보다 먼저 실행
  • 집계 함수(COUNT, SUM, AVG)등 사용 X
SELECT *         -- 예시이기 때문에 *를 사용하겠다.
  FROM EMP
 WHERE DEPTNO = 10;

위 SQL은 EMP 테이블에서 부서 번호(DEPTNO)가 10인 행만 먼저 선택한 한다. 이 단계에서는 아직 GROUP BY나 집계 함수가 적용되지 않는다.


2. HAVING 절이란?

HAVING 절은 GROUP BY로 그룹화된 결과에 조건을 거는 절이다. 이게 중요하다. 그룹화된 결과의 조건!!!

다시 말해 이미 집계가 끝난 결과를 대상으로 조건을 적용함.

SELECT DEPTNO
     , COUNT(*)
  FROM EMP
 GROUP BY DEPTNO
HAVING COUNT(*) >= 5;

이 SQL은 부서별로 그룹화한 뒤에 사원이 5명 이상인 부서만 조회한다.

📌 중요 포인트

  • HAVING은 GROUP BY 이후 실행
  • 집계 함수 사용 가능

3. WHERE절과 HAVING절을 동시에 쓰는 경우

실무에서는 두 절을 함께 사용하는 경우가 많아 알아두자.

SELECT DEPTNO
     , COUNT(*)
  FROM EMP
 WHERE SAL >= 3000
 GROUP BY DEPTNO
HAVING COUNT(*) >=3;

실행순서

  • WHERE -> 급여가 3000 이상인 직원만 필터 한다.
  • GROUP BY -> 부서별로 그룹화를 한다.
  • HAVING -> 직원 수가 3명 이상인 부서만 선택한다.

WHERE절은 데이터 양을 줄이는 것이고 HAVING절은 그룹 결과를 거르는 것이다..!!!


4. 자주 발생하는 실수

WHERE 절에서는 집계 함수를 사용할 수 없다 꼭 기억하자...!!! 에러발생

-- 잘못된 예시
SELECT DEPTNO
    , COUNT(*)
 FROM EMP
WHERE COUNT(*) >=3
GROUP BY DEPTNO;

마무리

WHERE절과 HAVING절은 문법만 놓고 보면은 매우 단순하지만 코드가 길어지거나 집계함수가 많아질경우 헷갈릴 수도 있다. 그래서 이 두절의 차이를 정확하게 이해하지 못하면 GROUP BY를 사용하는 순간 쿼리가 점점 복잡하게 느껴지고 작은 수정에도 오류가 발생하기 쉬워진다. 특히 이제 배우는 개발자분들은 조건을 걸고 싶으면 WHERE절만 걸면 되는 거 아닌가..? 하고 집계 함수 오류를 만나고 WHERE절에 집계함수 조건을 걸 수도 있다. 중요한 기준은 이 조건이 행(Row)에 대한 조건인지 집계된 결과에 대한 조건인지만 명확하게 알면 될 것 같다. 오늘은 WHERE절과 HAVING절에 대해 알아보았다. 감사합니다. (_ _)