2026년 06월 19일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-00928 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-00928 missing SELECT keyword 는?
ORA-00928 에러는 Oracle SQL 문장에서 SELECT 키워드가 누락되었거나 잘못된 위치에 사용되었을 때 발생하는 문법 오류입니다. Oracle 파서(Parser)가 SQL 문장을 분석하는 과정에서 SELECT가 있어야 할 자리에 다른 키워드나 예상치 못한 토큰을 만나면 이 에러를 던집니다. 주로 복잡한 서브쿼리, INSERT ~ SELECT 구문, CREATE VIEW 문장, 또는 단순 오타에 의해 발생하며, 초보자뿐만 아니라 숙련된 개발자도 빠르게 쿼리를 작성하다가 쉽게 마주치는 에러입니다.
주요 발생 원인
1. INSERT 문에서 SELECT 키워드 누락
INSERT INTO ~ SELECT 구문을 사용할 때 SELECT 키워드를 빠뜨리는 경우가 가장 흔한 원인입니다. 특히 INSERT INTO 테이블명 다음에 VALUES 대신 서브쿼리를 사용해야 하는 상황에서, SELECT를 생략하고 바로 컬럼 목록이나 FROM 절을 작성하면 Oracle은 즉시 ORA-00928을 발생시킵니다. 대용량 데이터 이관 작업이나 배치 프로그램 작성 시 특히 자주 발생합니다.
2. CREATE VIEW 또는 서브쿼리에서 SELECT 누락
CREATE VIEW 문장을 작성할 때 AS 키워드 뒤에 반드시 SELECT 문이 와야 하는데, 이를 생략하거나 잘못된 순서로 작성하면 에러가 발생합니다. 또한 인라인 뷰(Inline View)나 WITH 절(CTE)을 작성할 때도 괄호 내부에 SELECT가 없으면 동일한 에러가 발생합니다. 복잡한 다중 서브쿼리 작성 시 괄호 매칭 오류와 함께 발생하는 경우가 많아 디버깅이 까다롭습니다.
3. UNION / UNION ALL 구문에서의 오류
UNION 또는 UNION ALL로 여러 쿼리를 결합할 때, 두 번째 이후 쿼리 블록에서 SELECT를 빠뜨리는 실수가 발생합니다. 쿼리가 길어질수록 각 UNION 블록의 시작 부분을 놓치기 쉬우며, 특히 복사-붙여넣기 작업 중에 일부 내용이 잘리면서 SELECT가 사라지는 경우가 실무에서 빈번합니다. 여러 결과셋을 하나로 합치는 리포트 쿼리나 데이터 동기화 스크립트에서 자주 목격됩니다.
해결 방법
원인 1 해결: INSERT ~ SELECT 구문 수정
잘못된 쿼리 (에러 발생):
-- ORA-00928 발생
INSERT INTO emp_backup
emp_id, emp_name, salary
FROM employees
WHERE department_id = 10;
올바른 쿼리:
-- SELECT 키워드 추가
INSERT INTO emp_backup (emp_id, emp_name, salary)
SELECT emp_id, emp_name, salary
FROM employees
WHERE department_id = 10;
INSERT ~ SELECT 구문에서는 반드시 SELECT 키워드가 컬럼 목록 앞에 위치해야 합니다. VALUES 절과 SELECT 절은 함께 사용할 수 없으므로 데이터를 조회해서 삽입할 때는 항상 INSERT INTO ... SELECT ... 패턴을 따라야 합니다.
원인 2 해결: CREATE VIEW 구문 수정
잘못된 쿼리 (에러 발생):
-- ORA-00928 발생
CREATE OR REPLACE VIEW v_active_employees AS
emp_id, emp_name, department_id
FROM employees
WHERE status = 'ACTIVE';
올바른 쿼리:
-- AS 뒤에 SELECT 키워드 추가
CREATE OR REPLACE VIEW v_active_employees AS
SELECT emp_id, emp_name, department_id
FROM employees
WHERE status = 'ACTIVE';
서브쿼리(인라인 뷰) 예제:
-- 잘못된 인라인 뷰
SELECT a.emp_name, b.dept_name
FROM employees a,
(dept_id, dept_name FROM departments WHERE location_id = 1800) b
WHERE a.department_id = b.dept_id;
-- 올바른 인라인 뷰
SELECT a.emp_name, b.dept_name
FROM employees a,
(SELECT dept_id, dept_name FROM departments WHERE location_id = 1800) b
WHERE a.department_id = b.dept_id;
원인 3 해결: UNION / UNION ALL 구문 수정
잘못된 쿼리 (에러 발생):
-- ORA-00928 발생 (두 번째 블록에 SELECT 누락)
SELECT emp_id, emp_name, 'CURRENT' AS status
FROM employees
UNION ALL
emp_id, emp_name, 'RETIRED' AS status
FROM retired_employees;
올바른 쿼리:
-- 각 UNION 블록에 SELECT 키워드 명시
SELECT emp_id, emp_name, 'CURRENT' AS status
FROM employees
UNION ALL
SELECT emp_id, emp_name, 'RETIRED' AS status
FROM retired_employees;
WITH 절(CTE) 사용 예제:
-- 잘못된 CTE
WITH dept_summary AS (
dept_id, COUNT(*) AS emp_count
FROM employees
GROUP BY dept_id
)
SELECT d.dept_name, s.emp_count
FROM departments d
JOIN dept_summary s ON d.dept_id = s.dept_id;
-- 올바른 CTE
WITH dept_summary AS (
SELECT dept_id, COUNT(*) AS emp_count
FROM employees
GROUP BY dept_id
)
SELECT d.dept_name, s.emp_count
FROM departments d
JOIN dept_summary s ON d.dept_id = s.dept_id;
예방 방법
1. SQL 포매터(Formatter) 및 린터(Linter) 도구 적극 활용
SQL Developer, Toad, DBeaver 등의 IDE에서 제공하는 SQL 자동완성 및 문법 검사 기능을 반드시 활용하세요. 이러한 도구들은 SELECT, FROM, WHERE 등 핵심 키워드 누락 시 실시간으로 경고를 표시하거나 자동으로 완성해 주기 때문에 단순 오타나 키워드 누락으로 인한 에러를 사전에 방지할 수 있습니다. 특히 팀 단위 개발 환경에서는 공통 SQL 코딩 컨벤션과 함께 린터 규칙을 CI/CD 파이프라인에 통합하면 더욱 효과적입니다.
2. 복잡한 쿼리는 단계적으로 작성하고 테스트
UNION, 서브쿼리, CTE 등이 복합적으로 사용되는 복잡한 쿼리는 한 번에 작성하지 말고, 가장 안쪽의 서브쿼리부터 단계별로 실행하며 검증하는 습관을 들이세요. 각 쿼리 블록이 독립적으로 정상 실행되는 것을 확인한 후 점진적으로 결합하면 SELECT 누락을 포함한 대부분의 문법 오류를 초기에 발견할 수 있습니다. 또한 코드 리뷰 시 SQL 문장의 첫 키워드를 반드시 확인하는 체크리스트를 팀 내에 공유하는 것도 좋은 방법입니다.
관련 에러
- ORA-00900:
invalid SQL statement— SQL 문장 자체가 Oracle이 인식하지 못하는 형태일 때 발생하며, ORA-00928과 유사하게 문법 오류 계열에 속합니다. - ORA-00923:
FROM keyword not found where expected— SELECT 절 이후 FROM 키워드가 없거나 잘못된 위치에 있을 때 발생하며, ORA-00928과 함께 SQL 문법 3대 에러로 불립니다. - ORA-00936:
missing expression— SELECT 목록이나 WHERE 절에서 표현식이 누락되었을 때 발생하며, 마찬가지로 SQL 파싱 단계에서 검출됩니다. - ORA-00907:
missing right parenthesis— 괄호가 닫히지 않았을 때 발생하며, 서브쿼리 작성 중 ORA-00928과 함께 자주 동반 발생합니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.