Oracle ORA-00934 오류 원인과 해결 방법 완벽 가이드

ORA-00934
2026년 06월 19일 | DBMS Error 가이드

이 글에서 다루는 내용

ORA-00934 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.

ORA-00934 group function is not allowed here 는?

ORA-00934 에러는 Oracle SQL에서 집계 함수(GROUP FUNCTION)를 사용할 수 없는 위치에 사용했을 때 발생하는 에러입니다. 대표적으로 WHERE 절, GROUP BY 절, CONNECT BY 절 등에 SUM(), AVG(), COUNT(), MAX(), MIN() 같은 집계 함수를 직접 사용할 때 Oracle 파서가 이 에러를 반환합니다. 30년간 현장에서 수없이 목격한 에러로, 주로 SQL 초보자뿐만 아니라 숙련된 개발자도 복잡한 쿼리를 작성하다 실수로 마주치는 매우 흔한 에러입니다.


주요 발생 원인

  • WHERE 절에서 집계 함수 사용

가장 빈번하게 발생하는 원인입니다. 많은 개발자들이 “평균 급여보다 많이 받는 직원을 조회하라”는 요구사항을 구현할 때 WHERE 절에 AVG() 같은 집계 함수를 직접 사용하려고 시도합니다. Oracle의 SQL 실행 순서상 WHERE 절은 데이터를 행 단위로 필터링하는 단계이기 때문에, 집계 결과가 아직 계산되지 않은 시점에서 집계 함수를 평가할 수 없어 에러가 발생합니다.

  • GROUP BY 절에서 집계 함수 사용

GROUP BY 절은 어떤 컬럼을 기준으로 그룹을 나눌지를 지정하는 절이며, 집계 함수의 결과값을 그룹 기준으로 사용하는 것은 논리적으로 불가능합니다. 예를 들어 GROUP BY SUM(salary)처럼 집계 함수 자체를 그룹핑 기준으로 삼으려 할 때 이 에러가 발생합니다. GROUP BY는 원시 컬럼값 또는 표현식(집계 함수 제외)만 허용합니다.

  • CONNECT BY 절 또는 START WITH 절에서 집계 함수 사용

계층형 쿼리(Hierarchical Query)를 작성할 때 CONNECT BY 또는 START WITH 절에 집계 함수를 사용하면 동일한 에러가 발생합니다. 이 절들도 행 단위 처리 구조를 가지므로 집계 함수를 직접 사용할 수 없습니다. 계층형 쿼리와 집계를 함께 사용해야 하는 경우 서브쿼리나 CTE(Common Table Expression)로 분리해야 합니다.


해결 방법

원인 1 해결: WHERE 절 → HAVING 절 또는 서브쿼리로 대체

잘못된 쿼리 (ORA-00934 발생):

-- 잘못된 예: WHERE 절에 집계 함수 사용
SELECT employee_id, first_name, salary
FROM employees
WHERE salary > AVG(salary);  -- ORA-00934 발생!

해결 방법 1 – 서브쿼리 사용:

-- 올바른 예: 서브쿼리로 집계값을 먼저 계산
SELECT employee_id, first_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

해결 방법 2 – WITH 절(CTE) 활용:

-- CTE를 활용한 가독성 높은 방법
WITH avg_salary AS (
    SELECT AVG(salary) AS avg_sal
    FROM employees
)
SELECT e.employee_id, e.first_name, e.salary
FROM employees e, avg_salary a
WHERE e.salary > a.avg_sal;

원인 2 해결: GROUP BY 절에서의 집계 함수 → HAVING 절로 이동

잘못된 쿼리 (ORA-00934 발생):

-- 잘못된 예: GROUP BY 절에 집계 함수 사용
SELECT department_id, SUM(salary)
FROM employees
GROUP BY department_id, SUM(salary);  -- ORA-00934 발생!

올바른 쿼리 – HAVING 절 사용:

-- 올바른 예: 집계 함수 조건은 HAVING 절에 작성
SELECT department_id, SUM(salary) AS total_salary
FROM employees
GROUP BY department_id
HAVING SUM(salary) > 50000;

부서별 평균 급여가 특정 값 이상인 부서 조회 (실무 예제):

-- 실무에서 자주 쓰이는 패턴
SELECT d.department_name,
       COUNT(e.employee_id) AS emp_count,
       ROUND(AVG(e.salary), 2) AS avg_salary,
       SUM(e.salary) AS total_salary
FROM employees e
JOIN departments d ON e.department_id = d.department_id
GROUP BY d.department_name
HAVING AVG(e.salary) >= 5000
ORDER BY avg_salary DESC;

원인 3 해결: CONNECT BY 절에서의 집계 함수 → 서브쿼리 또는 CTE 분리

잘못된 쿼리 (ORA-00934 발생):

-- 잘못된 예: CONNECT BY에서 집계 함수 사용
SELECT employee_id, manager_id, first_name
FROM employees
START WITH manager_id IS NULL
CONNECT BY PRIOR employee_id = manager_id
       AND salary > AVG(salary);  -- ORA-00934 발생!

올바른 쿼리 – 서브쿼리로 집계값 분리:

-- 올바른 예: 집계값을 서브쿼리로 미리 계산 후 조인
SELECT e.employee_id, e.manager_id, e.first_name, e.salary
FROM employees e
WHERE e.salary > (SELECT AVG(salary) FROM employees)
START WITH e.manager_id IS NULL
CONNECT BY PRIOR e.employee_id = e.manager_id;

예방 방법

  • SQL 실행 순서(Order of Execution)를 항상 머릿속에 새겨두기

Oracle SQL의 논리적 실행 순서는 FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY 입니다. 이 순서를 이해하면 어느 절에서 집계 함수를 사용할 수 있는지 자연스럽게 판단할 수 있습니다. WHERE는 그룹핑 이전 단계이므로 집계 함수 사용 불가, HAVING은 그룹핑 이후 단계이므로 집계 함수 사용 가능이라는 원칙을 팀 내 코딩 가이드에 명문화하여 공유하세요.

  • 코드 리뷰 및 SQL 린터(Linter) 도구 활용

복잡한 쿼리를 작성할 때는 반드시 동료 개발자의 코드 리뷰를 거치거나, SQL Developer, Toad, DBeaver 같은 IDE의 문법 검사 기능을 적극 활용하세요. 많은 현대 IDE는 이런 종류의 문법 오류를 실시간으로 하이라이트해 주므로, 운영 환경에 배포되기 전에 개발 단계에서 사전에 차단할 수 있습니다.


관련 에러

  • ORA-00935: group function is nested too deeply — 집계 함수를 3단계 이상 중첩했을 때 발생하며, ORA-00934와 유사한 집계 함수 오용 에러입니다.
  • ORA-00937: not a single-group group functionGROUP BY 절 없이 일반 컬럼과 집계 함수를 함께 SELECT에 나열했을 때 발생합니다.
  • ORA-00979: not a GROUP BY expressionSELECT에 명시된 컬럼이 GROUP BY 절에 포함되지 않았을 때 발생하며, ORA-00934와 함께 GROUP BY 관련 3대 에러로 꼽힙니다.

DBMS 에러 코드 시리즈

주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.

본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.

댓글 남기기