본문 바로가기
DATABASE/ORACLE

[Oracle] VIEW

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