2026년 06월 18일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-00924 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-00924 missing BY keyword 는?
ORA-00924 에러는 Oracle SQL 문장에서 GROUP BY, ORDER BY, PARTITION BY 등 복합 키워드 구문을 사용할 때 BY 키워드가 누락되어 발생하는 구문(Syntax) 오류입니다. Oracle 파서(Parser)가 SQL 문장을 분석하는 도중 예상되는 BY 키워드를 찾지 못할 때 이 에러를 발생시키며, 주로 타이핑 실수나 SQL 문법에 대한 이해 부족으로 인해 나타납니다. 이 에러는 쿼리 실행 전 파싱 단계에서 감지되므로, 실제 데이터에 영향을 주지는 않지만 즉시 수정이 필요합니다.
주요 발생 원인
GROUP BY절에서BY키워드 누락
가장 빈번하게 발생하는 케이스로, 집계 함수(SUM, COUNT, AVG 등)와 함께 사용하는 GROUP BY 절에서 BY를 빠뜨리는 경우입니다. 복잡한 쿼리를 빠르게 작성하다 보면 GROUP 뒤에 BY를 생략하는 실수가 자주 발생하며, 특히 다른 데이터베이스(MySQL, MSSQL 등)에서 Oracle로 마이그레이션하는 개발자들에게 자주 나타납니다. 이 경우 Oracle은 GROUP 다음에 오는 컬럼명이나 표현식을 인식하지 못하고 즉시 ORA-00924를 반환합니다.
ORDER BY절에서BY키워드 누락
결과셋을 정렬하기 위한 ORDER BY 절에서 BY가 생략되는 경우도 매우 흔합니다. 특히 서브쿼리(Subquery)나 인라인 뷰(Inline View) 내부에서 ORDER BY를 작성할 때 복잡한 괄호 구조 때문에 키워드가 누락되기 쉽습니다. 대용량 보고서용 쿼리나 복잡한 분석 쿼리에서 이런 실수가 발생하면, 쿼리 전체를 재검토해야 하는 상황이 생길 수 있습니다.
- 분석 함수(Analytic Function)에서
PARTITION BY또는ORDER BY누락
ROW_NUMBER(), RANK(), DENSE_RANK(), LAG(), LEAD() 등 Oracle 분석 함수(Window Function)의 OVER() 절 내부에서 PARTITION BY 또는 ORDER BY를 작성할 때 BY를 생략하는 경우입니다. 분석 함수는 문법 구조가 복잡하여 PARTITION 뒤에 BY를 빠뜨리는 실수가 잦으며, 이는 실무에서 분석 쿼리를 다루는 DBA나 개발자들이 자주 직면하는 문제입니다. OVER(PARTITION col_name ORDER BY col_name) 처럼 두 키워드를 동시에 잘못 입력하면 에러가 두 군데서 발생할 수도 있습니다.
해결 방법
원인 1 해결: GROUP BY 절 수정
잘못된 쿼리 (에러 발생):
-- ORA-00924 발생: GROUP 뒤에 BY 누락
SELECT department_id, COUNT(*) AS emp_count
FROM employees
GROUP department_id;
수정된 쿼리:
-- 올바른 쿼리: GROUP BY 완전히 작성
SELECT department_id, COUNT(*) AS emp_count
FROM employees
GROUP BY department_id;
복합 GROUP BY 예제:
-- 부서별, 직급별 평균 급여 조회
SELECT department_id,
job_id,
AVG(salary) AS avg_salary,
MAX(salary) AS max_salary,
COUNT(*) AS emp_count
FROM employees
GROUP BY department_id, job_id
ORDER BY department_id, avg_salary DESC;
원인 2 해결: ORDER BY 절 수정
잘못된 쿼리 (에러 발생):
-- ORA-00924 발생: ORDER 뒤에 BY 누락
SELECT employee_id, last_name, salary
FROM employees
ORDER salary DESC;
수정된 쿼리:
-- 올바른 쿼리: ORDER BY 완전히 작성
SELECT employee_id, last_name, salary
FROM employees
ORDER BY salary DESC;
서브쿼리 내 ORDER BY 예제:
-- 인라인 뷰에서 ORDER BY 사용 (올바른 예)
SELECT *
FROM (
SELECT employee_id,
last_name,
salary,
ROWNUM AS rn
FROM employees
ORDER BY salary DESC
)
WHERE rn <= 10;
원인 3 해결: 분석 함수 내 PARTITION BY / ORDER BY 수정
잘못된 쿼리 (에러 발생):
-- ORA-00924 발생: PARTITION 뒤에 BY 누락
SELECT employee_id,
department_id,
salary,
RANK() OVER (PARTITION department_id ORDER BY salary DESC) AS sal_rank
FROM employees;
수정된 쿼리:
-- 올바른 쿼리: PARTITION BY 완전히 작성
SELECT employee_id,
department_id,
salary,
RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS sal_rank,
ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS row_num,
DENSE_RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS dense_rnk
FROM employees
ORDER BY department_id, sal_rank;
LAG/LEAD 함수 활용 예제:
-- 이전 달 대비 급여 변동 분석 (PARTITION BY, ORDER BY 모두 올바르게 사용)
SELECT employee_id,
department_id,
hire_date,
salary,
LAG(salary, 1, 0) OVER (PARTITION BY department_id ORDER BY hire_date) AS prev_salary,
LEAD(salary, 1, 0) OVER (PARTITION BY department_id ORDER BY hire_date) AS next_salary
FROM employees
ORDER BY department_id, hire_date;
예방 방법
- SQL 작성 시 키워드 완전성 체크리스트 활용
팀 내에서 SQL 코드 리뷰 프로세스를 수립하고, GROUP BY, ORDER BY, PARTITION BY 등의 복합 키워드는 반드시 짝을 이루어 작성하는 습관을 들이세요. SQL Developer, Toad, DBeaver 등 IDE의 SQL 자동 완성(Auto-Complete) 기능을 적극 활용하면 이러한 키워드 누락 실수를 사전에 방지할 수 있습니다. 또한 CI/CD 파이프라인에 SQLPlus 또는 SQL*Plus 기반의 구문 검증 스크립트를 추가하여 배포 전 SQL 유효성을 자동으로 검사하는 체계를 갖추는 것을 권장합니다.
- 분석 함수 템플릿(Template) 사전 정의 및 공유
분석 함수는 문법이 복잡하여 오류가 잦으므로, 팀 공유 문서나 IDE 코드 스니펫(Snippet)으로 올바른 분석 함수 템플릿을 미리 정의해 두세요. 예를 들어 RANK() OVER (PARTITION BY [컬럼] ORDER BY [컬럼] DESC)와 같은 형태를 표준 템플릿으로 등록해 두면, 매번 처음부터 타이핑하는 것보다 오류 발생 가능성을 크게 낮출 수 있습니다. 신규 입사자나 Oracle에 익숙하지 않은 개발자에게는 분석 함수 관련 내부 교육 자료를 제공하고, 실습 환경에서 충분히 연습하도록 유도하는 것이 중요합니다.
관련 에러
- ORA-00923:
FROM keyword not found where expected—FROM키워드가 누락되었거나 잘못된 위치에 있을 때 발생하며, ORA-00924와 함께 SQL 구문 오류의 대표적인 사례입니다. - ORA-00907:
missing right parenthesis— 분석 함수의OVER()절이나 서브쿼리에서 괄호가 맞지 않을 때 발생하며,PARTITION BY관련 수정 작업 시 함께 나타날 수 있습니다. - ORA-00936:
missing expression—GROUP BY또는ORDER BY뒤에 정렬/그룹 기준 컬럼이나 표현식이 누락되었을 때 발생하는 에러로, ORA-00924와 유사한 맥락에서 자주 등장합니다. - ORA-00933:
SQL command not properly ended— SQL 문장의 마지막 부분에 잘못된 절이 추가되거나 구문이 올바르게 종료되지 않았을 때 발생하며, 복잡한ORDER BY수정 과정에서 함께 발생하기도 합니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.