문제
다음은 뷰(View)를 생성하고 이를 조회/수정하는 과정이다. 실행 시 오류(Error)가 발생하는 쿼리는?
① SELECT * FROM V1 WHERE SS > 5000; ② SELECT A.DEPTNO, B.DNAME FROM V1 A JOIN DEPT B ON A.DEPTNO = B.DEPTNO; ③ SELECT DEPTNO, AVG(SS) FROM V1 GROUP BY DEPTNO; ④ INSERT INTO V1 (DEPTNO, SS) VALUES (50, 8000);
정답
4번
해설
정답: 4. V1은 GROUP BY와 집계함수(SUM)로 정의된 뷰여서 각 행이 실제 기본 테이블의 단일 행과 1:1로 대응하지 않는다. 이런 그룹/집계 뷰는 갱신 불가능(non-updatable)하므로 INSERT/UPDATE/DELETE가 모두 오류를 낸다. SS는 SUM(SAL)의 결과일 뿐 실제 컬럼이 아니어서 값을 거꾸로 써넣을 수 없다.
오답 풀이
- ①: 뷰를 단순 조회하며 별칭 SS로 필터링하는 정상 SELECT다.
- ②: 뷰와 DEPT 테이블을 DEPTNO로 조인하는 정상 조회다.
- ③: 뷰 결과를 다시 그룹·집계하는 정상 조회다(SELECT는 제약 없음).
- ④: 정답. 집계·GROUP BY 뷰라 DML(INSERT)이 허용되지 않아 오류가 난다.
보충 개념 뷰가 갱신 가능하려면 기본적으로 단일 테이블 기반이며 GROUP BY·집계함수·DISTINCT·집합연산 등이 없어야 한다. 이런 요소가 들어간 뷰는 읽기 전용으로만 사용할 수 있다.