1 뷰
- 가상 테이블로서, 데이터 딕셔너리 테이블에 뷰의 정의만 저장되고, 저장공간은 할당 안된다
=> 보안과 사용자 편의성(flexibility)
ex) 교수 테이블에서 개인정보는 가리고, 나머지는 학생들에게 제공해서 사용할 수 있게
- 뷰에 대한 수정 결과는 기본 테이블에 적용된다 => 뷰를 정의한 기본테이블의 무결성 제약 조건 상속
- 뷰의 종류
- 단순 뷰(simple view): 하나의 기본 테이블에 의해 정의.
- 복합 뷰(complex view): 두 개이상.
- 뷰의 내부 처리 과정
- 0 사용자가 질의(select * from v_stud_dept101 where name = '김영균')
- 1 USER_VIEW 데이터 딕셔너리에서 v_stud_dept101 뷰의 정의 조회
- 2 기본 테이블에 대한 뷰 접근 권한 확인
- 3 뷰에 대한 질의를 기본 테이블에 대한 질의로 내부에서 변환
- 4 변환된 질의로, 기본 테이블의 데이터 검색
- 5 검색 결과 출력
2 뷰 관리
2-1 뷰 생성
CREATE [FORCE/NOFORCE] VIEW v_stud_dept101 [(기본 테이블과 칼럼 이름 칼럼 이름 지정, ...)]
AS SELECT studno, name, deptno
FROM student
WHERE deptno = 101;
- grant creat view to hr 로 권한 부여해야 가능
FORCE NOFORCED: 후자는 기본 테이블 student가 있을 때만 생성하는 것으로, default. 전자는 없더라도 뷰 생성.
- 복합 뷰의 경우
CREATE VIEW v_stud_dept102
AS SELECT s.studno, s.name, s.grade, d.dname
FROM student s, deparment d
WHERE s.deptno = d.deptno and s.deptno 102;
- 함수 사용해서 뷰 생성하는 경우 칼럼별명 필수
CREATE VIEW v_prof_avg_sal
AS SELECT deptno, sum(sal) sum_sal, avg(sal) avg_sal
FROM professor
GROUP BY deptno;
2-2 인라인 뷰(inline view)
- FROM 절에 참조하는 테이블이 클 때, 필요한 행과 컬럼으로 구성된 서브쿼리를 재정의해서 효율적으로 만드는 것
SELECT dname, avg_height, avg_weight
FROM (SELECT deptno, avg(height) avg_height, avg(weight) avg_weight
FROM student
GROUP BY deptno) s, department d
WHERE s.deptno = d.deptno;
2-3 뷰 조회
- USER_VIEWS에 저장되어 있다. 아래는 view_name과 그 내용 조회.
SELECT view_name, text
FROM user_views;
2-4 뷰 변경
CREATE OR REPLACE VIEW v_stud_dept101
AS SELECT studno, name, deptno, grade
FROM student
WHERE deptno = 101;
- 기존 뷰가 같은 이름으로 있다면 삭제하고 재생성 => 변경 결과는 USER_VIEWS에 저장
2-5 뷰 삭제
- 기본 테이블의 구조나 데이터는 전혀 영향 없음
- USER_VIEWS에서 저장된 뷰의 정의만 삭제(어차피 가상 테이블)
DROP VIEW v_stud_dept101;
2-6 뷰의 종류와 데이터 조작
- 뷰의 종류에 따라 데이터 조작 가능 범위가 다르다
- 단순 뷰(simple view): 기본 테이블의 무결성 제약조건만 적용. DML 실행 결과 기본 테이블에 반영.
- 복합 뷰(complex view): DML 명령문 제한적 사용
- 뷰 정의에 포함되지 않는 기본 테이블의 칼럼이 Not null 제약조건 지정
- 뷰 정의시 표현식으로 정의된 칼럼에 대해서 UPDATE, INSERT 명령문 실행 불가능
- 그룹함수, DISTINCT, GROUP BY 절 포함한 경우 모든 종류 DML 불가