사용자에게 접근이 허용된 데이터만을 제한적으로 보여주기 위해 하나 이상의 기본 테이블로부터 유도된 가상 테이블
(기본 테이블 = 뷰를 만드는 데 기반이 되는 물리적 테이블)
뷰는 데이터가 없고 SQL을 저장하고 있음
ex) 아래 뷰는 insert 작업이 불가능함 (삽입 연산 시 기본 키에 null 값이 들어가기 때문에)
-- 기본테이블은 student { sno(pk), sname, dept }
CREATE VIEW student_view AS sname, dept
FROM student;
논리적 데이터 독립성이란?
DBMS가 데이터베이스의 논리적 구조를 변경시키더라도 기존 응용 프로그램에 영향을 주지 않는 것
- 뷰에 새로운 애트리뷰트가 추가 되어도 기본 테이블에는 영향을 주지 않음
- 반대로 기본테이블에 새로운 애트리뷰트가 추가되어도 뷰에는 영향을 주지 않음
단순 뷰인 경우 INSERT, UPDATE, DELETE가 자유로우며 (NOT NULL 컬럼 주의)
함수, UNION, GROUP BY 등을 사용한 복합 뷰인 경우 INSERT, UPDATE, DELETE가 불가능함 (조인만 사용한 복합 뷰인 경우 제한적으로 가능)
CREATE OR REPLACE VIEW v_emp
AS
SELECT a.empno, a.ename, a.job
, TO_CHAR(a.hiredate, 'YYYY-MM-DD') AS hiredate
, b.deptno
FROM emp a, dept b
WHERE a.deptno = b.deptno
;
INSERT INTO v_emp(empno, ename, deptno) VALUES(9999, 'TEST', 20)
❌ ORA-01776: 조인 뷰에 의하여 하나 이상의 기본 테이블을 수정할 수 없습니다
INSERT INTO v_emp(empno, ename) VALUES(9999, 'TEST')
⭕️ deptno 컬럼을 제외하면 정상적으로 입력 된다
CREATE OR REPLACE VIEW v_emp
AS
SELECT empno, ename, job
FROM emp
WHERE deptno = '10'
UNION ALL
SELECT empno, ename, job
FROM emp
WHERE deptno = '20'
;
UPDATE v_emp SET ename = 'TEST' WHERE empno = '7369'
❌ ORA-01732: 뷰에 대한 데이터 조작이 부적합합니다
UNION, GROUP BY 등을 사용한 쿼리는 INSERT, UPDATE, DELETE를 사용할 수 없다
-- MySQL, Oracle
CREATE VIEW 뷰이름[(속성이름)] AS SELECT문;
--고객 테이블에서 주소가 서울시인 고객들의 성명과 전화번호를 서울고객이라는 뷰로 만들어라--
CREATE VIEW 서울고객(성명, 전화번호)
AS SELECT 성명 전화번호
FROM 고객
WHERE 주소 = '서울시';
-- MySQL, Oracle
DROP VIEW 뷰이름 RESTRICT or CASCADE
--서울고객이라는 뷰를 삭제해라--
DROP VIEW 서울고객 RESTRICT;