VIEW
VIEW란?
● 물리적인 테이블을 근거한 논리적인 가상 테이블
● 가상이란, 실질적으로 데이터를 저장하지 않고 있지 않기 때문에 붙인 것이고, 테이블이란 단어는 실질적으로 데이터를 저장하고 있지 않더라도 사용자는 마치 테이블을 사용하는 것과 동일하게 뷰를 사용 할 수 있기 때문에 붙인 것이다
● 뷰는 기본 테이블에서 파생된 객체로서 기본 테이블에 대한 하나의 쿼리문이다
● 사용자에게 주어진 뷰를 통해서 기본 테이블을 제한적으로 사용하게 된다
● 뷰를 생성하기 위해서는 실질적으로 데이터를 저장하고 있는 물리적인 테이블이 존재해야하는데 이 테이블을 기본 테이블이라 한다
VIEW의 생성
기본 형태
CREATE[OR REPLACE] [FORCE | NONFORCE] VIEW 뷰이름
AS 서브쿼리문
[WITH CHECK OPTION]
[WITH READ ONLY];
● CREATE OR REPLACE VIEW
- CREATE VIEW는 뷰의 구조 변경 시 삭제 후 재생성 해야 한다
- CREATE OR REPLACE VIEW는 기존 뷰가 있어도 삭제하지 않고 새로운 구조로 변경 가능
● FORCE : 기본 테이블의 존재여부를 따지지 않고 뷰를 강제적으로 생성
● WITH CHECK OPTION : 해당 뷰를 통해서 볼 수 있는 범위 내에서만 UPDATE 또는 INSERT 가능
● WITH READ ONLY : SELECT만 가능
※ 뷰 생성시 권한으로 인해 에러 발생시 GRANT CREATE VIEW TO 사용자명
DEPT 테이블과 EMP 테이블의 내용이 변경 되는 것을 막기 위해 테이블의 내용을 복사한 새로운 테이블을 생성 한 후에 기본 테이블로 사용해보자
1 2 3 4 5 6 7 | SQL> create table dept_copy as select *from dept; 테이블이 생성되었습니다. SQL> create table emp_copy as select *from emp; 테이블이 생성되었습니다. | cs |
자주 검색하는 내용들을 검색 할 때 마다 SELECT문을 입력해야 하는데 이를 쉽게 원하는 결과를 얻기 위해 뷰를 사용한다
1 2 3 4 5 6 | SQL> create view emp_view as 2 SELECT empno, ename, deptno 3 FROM emp_copy 4 WHERE deptno=30; 뷰가 생성되었습니다. | cs |
30번 부서에 소속된 사원들의 번호와 이름과 부서번호 출력하는 뷰를 만들었다
1 2 3 | SQL> INSERT INTO emp_view VALUES(111,'ABC',30); 1 개의 행이 만들어졌습니다. | cs |
뷰를 통해 테이블의 데이터를 수정하는 것도 가능하다
VIEW 종류
종류 |
SIMPLE-VIEW (단순 뷰) |
COMPLEX-VIEW (복합 뷰) |
테이블 수 |
1개 |
2개 이상 |
그룹 함수 |
사용 불가능 |
사용가능 |
DISTINCT |
사용 불가능 |
사용 가능 |
DML문 |
사용 가능 |
사용 불가능 |
● 단순 뷰
- 데이터 추가 INSERT
- 그룹 함수 사용 : 급여의 총액과 평균을 구하는 칼럼에 별칭 부여, DEPTNO를 기준으로 만들기, 가상 칼럼을 사용하기 위해서는 사용자가 반드시 이름을 따로 설정 해야 한다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | SQL> CREATE VIEW sal_view 2 as 3 SELECT deptno, sum(sal) as "SALSUM", avg(sal) as "SALAVG" 4 FROM emp 5 GROUP by deptno; 뷰가 생성되었습니다. SQL> SELECT *FROM sal_view; DEPTNO SALSUM SALAVG ---------- ---------- ---------- 30 9400 1566.66667 20 10875 2175 10 8750 2916.66667 | cs |
● 복합 뷰
- 데이터 추가 : 복잡하고 긴 쿼리문을 뷰로 정의하면 접근을 단순화 시킬 수 있다
1 2 3 4 | SELECT e.empno, e.ename, e.sal, d.dname, d.loc FROM emp_copy e, dept_copy d WHERE e.deptno = d.deptno ORDER BY empno desc; | cs |
1 2 3 4 5 6 7 8 9 | CREATE VIEW total_view as SELECT e.empno, e.ename, e.sal, e.deptno, d.dname, d.loc FROM emp_copy e, dept_copy d WHERE e.deptno = d.deptno ORDER BY empno desc; SELECT *FROM total_view; | cs |
사용자가 생성한 모든 뷰에 대한 정의는 USER_VIEWS라는 이름의 데이터 딕셔너리에 저장되어 있다.
1 2 | SELECT view_name,text FROM user_views; | cs |
확인 해볼 수 있다
삭제
1 | DROP VIEW sal_view; | cs |
수정
1 2 3 4 5 6 7 | CREATE OR REPLACE VIEW emp_view AS SELECT empno, ename, sal, deptno FROM emp_copy WHERE deptno = 30; SELECT *FROM emp_view; | cs |
존재하지 않은 VIEW이면 새로운 VIEW를 생성하고. 기존에 존재한다면 내용을 변경한다
기본 테이블 없이 VIEW를 생성하고자 할 때는 FORCE를 사용한다
1 2 3 4 5 | CREATE OR REPLACE FORCE VIEW force_view as SELECT empno, ename FROM emp2 WHERE deptno=30; | cs |
emp2 테이블은 없지만 VIEW가 생성되었다
WITH CHECK OPTION : 뷰 생성시 조건으로 지정한 칼럼 값을 변경하지 못하도록 하고 싶을 때
1 2 3 4 5 6 | CREATE OR REPLACE VIEW check_view as SELECT empno, ename, deptno FROM emp_copy WHERE deptno = 20 WITH CHECK OPTION; | cs |
WITH READ ONLY : 뷰를 통해서는 어떤 테이블의 칼럼의 내용을 변경 불가
1 2 3 4 5 6 | CREATE OR REPLACE VIEW check_view as SELECT empno, ename, deptno FROM emp_copy WHERE deptno = 20 WITH READ ONLY; | cs |
'DATABASE > ORACLE' 카테고리의 다른 글
[Oracle] 무결성 제약조건 (3) | 2018.04.22 |
---|---|
[Oracle] Transaction (3) | 2018.04.21 |
[Oracle] SQL DML / DDL (2) | 2018.04.21 |
[Oracle] SQL 서브쿼리 (2) | 2018.04.21 |
[Oracle] SQL Outer Join / ANSI Join (1) | 2018.04.20 |