출처 : http://naver.kaist.ac.kr/oracle_sql/s14.htm
1. 뷰?
◈뷰란 테이블이나 다른 뷰를 기초로 한 논리적인 테이블이다.
◈뷰는 자체의 데이터는 없지만 테이블의 데이터를 보거나 변경할 수 있는 창과 같다.
◈뷰는 실제적으로는 질의문장을 가진다.
♣ 뷰의 장점
◈뷰는 데이터베이스의 선택적인 내용을 보여줄 수 있기 때문에 데이터베이스에 대한 액세스를 제한한다.
◈복잡한 질의어를 통해 얻을 수 있는 결과를 간단한 질의어를 써서 구할 수 있게 한다. 예를 들면 조인 방법을 몰라도 조인을 한것처럼 여러 테이블에 대한 데이터를 뷰를 통해 볼수 있다.
◈한 개의 뷰로 여러 테이블에 대한 데이터를 검색할 수 있다.
◈특정 평가기준에 따른 사용자 별로 다른 데이터를 액세스할 수 있다. 예를 들면 10번 부서의 직원은 10번 부서 직원들로 구성된 사원 테이블을 보게 할 수도 있다.
2. 뷰 생성/변경
♣ Syntax
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW 뷰명 [(alias[,alias]...)]
AS Subquery [WITH CHECK OPTION [CONSTRAINT 제약조건]]
[WITH READ ONLY]
◈CREATE VIEW문에 Subquery를 써서 뷰를 만든다.
◈FORCE는 Base Table 유무에 관계없이 뷰를 만든다.
◈Alias는 Subquery를 통해 선택된 값에 대한 Column명이 된다.
◈WITH CHECK OPTION은 뷰에 의해 액세스 될수 있는 행만이 입력되거나 변경될 수 있음을 지정하고,
WITH READ ONLY는 이뷰에서 DML이 수행될 수 없게 한다.
◈뷰를 정의하는 질의어는 조인, 그룹, Subquery를 포함하는 복잡한 SELECT문장으로 구성될 수 있다.
◈뷰를 정의하는 질의어에는 ORDER BY 절을 쓸 수 없다.
◈제약조건의 이름을 명시하지 않으면 시스템이 SYS_Cn 형태의 이름을 지정한다.
◈뷰를 재생성하지 않고 뷰의 정의를 변경하려면 OR REPLACE옵션을 쓸 수 있다.
♣ Simple뷰와 Complex뷰
특징 | Simple뷰 | Complex뷰 |
테이블의 수 | 하나 | 하나이상 |
데이터 그룹 포함 가능여부 | 가능 | 가능 |
뷰를 통한 DML | 가능 | 불가능 |
♣ Simple뷰 생성
♠실습 : 부서번호가 45인 사번과 성, 직급을 가지는 뷰를 만들고 내용을 출력하시오.
SQL> CREATE VIEW empview45 |
♠실습 : empview45 뷰를 사번이 ID_NUMBER로, 성이 EMPPLOYEE로, 직급이 JOB이 되도록 변경하시오.
SQL> CREATE OR REPLACE VIEW empview45 (id_number, employee, job) |
♣ Complex 생성
♠실습 : 부서의 이름과 최소급여, 최고급여, 평균급여에 대한 뷰를 만들고 뷰의 구조와 내용을 출력하시오.
SQL> CREATE VIEW dept_emp_view(name, minsal, maxsal, avgsal) |
3. 뷰(View)에 대한 DML 문 사용
◈Simple 뷰에서는 DML연산을 수행.
◈뷰를 통하여 다음의 DML연산은 수행할 없다.
행을 삭제할 수 없는 경우 | 데이터를 수정할 수 없는 경우 | 데이터를 추가할 수 없는 경우 |
- 조인 조건 | - 조인 조건 | - 조인 조건 |
| - 식으로 정의된 Column. | - 뷰로 선택되지 않은NOT NULL Column. |
◈위에 열거한 것 중 어느 것도 포함하지 않고 뷰에서 선택하지 않은 Base table에 NOT NULL
Column이 있지 않으면 뷰를 통해 데이터를 추가할 수 있음.
♣ WITH CHECK OPTION 절의 이용
♠실습 : 부서번호 41에 대해 WITH CHECK OPTION절을 추가하여s_emp 테이블의 모든 column을
갖는 뷰를 만드시오.
SQL> CREATE OR REPLACE VIEW empview41 |
♠실습 : 뷰를 통해 사원 16의 부서번호를 42로 바꾸어 보시오.
SQL> UPDATE empview41 SET dept_id = 42 WHERE id =16; |
◈Note : 부서번호가 42로 바뀌면 뷰는 더 이상 해당 사원을 볼 수 없기 때문에 error가 발생한다.
따라서 WITH CHECK OPTION절을 써서 뷰는 단지 부서41의 사원만을 볼수 있고
이 사원의 부서번호는 뷰를 통해서는 변경할 수 없게 한다.
♣ WITH READ ONLY 옵션
◈ 뷰 정의에 WITH READ ONLY옵션을 추가하여 DML연산이 수행될 수 없게 한다.
♠실습 : empview45 뷰를 DML연산이 수행되지 않게 수정하시오.
SQL> CREATE OR REPLACE VIEW empview45(id_number,employee,job) |
♠실습 : 위에서 변경한 empview45 뷰에서 id_number가 10인 행을 삭제해 보시오.
SQL> DELETE FROM empview45 WHERE id_number = 10; |
4. 뷰의 구조 및 이름 확인
◈USER_VIEWS Dictionary 뷰에서 해당 뷰의 query 문장과 뷰 이름을 확인할 수 있음
SQL> SELECT view_name, text_length, text |
♠실습 : USER_VIEWS Dictionary 뷰의 구조를 보라.
SQL> DESC user_views; |
♠실습 : 사용자가 현재 소유한 모든 뷰의 이름과 내용을 출력하라.
SQL> SELECT * FROM user_views; |
5. 뷰 삭제
◈뷰를 삭제 하려면 DROP VIEW 명령을 사용한다.
◈이 명령은 데이터베이스에서 뷰의 정의를 삭제한다.
◈뷰는 데이터베이스의 테이블을 토대로 하기 때문에, 데이터의 손실없이 뷰를 삭제할 수 있다.
♠실습 : empview45뷰를 삭제하시오.
SQL> DROP VIEW empview45; |