데이터베이스

[데이터베이스] VIEW

Yuco 2024. 7. 10. 18:55

[1] VIEW 정의

- 대게 SELECT를 위해 사용, 한 개 이상의 기본 테이블이나 다른 뷰를 이용하여 생성되는 가상 테이블

- 기존에 생성된 테이블 또는 다른 뷰에서 접근할 수 있는 전체 데이터 중에서 일부만 접근할 수 있도록 제한하기 위한 기법

- 뷰를 가상 테이블이라고 하는 이유는 테이블은 디스크 공간이 할당되어 데이터를 저장할 수 있지만, 뷰는 데이터 딕셔너리 테이블에 뷰에 대한 정의만 저장하고 디스크에 저장 공간이 할당되지 않음

 

 

[2] VIEW 특징

1. 특징

- 뷰 자체는 데이터를 갖지 않지만, 기초 테이블의 데이터를 조회하고 수정할 수 있는 창과 같음 (조작도 기본 테이블과 거의 같음)

- 뷰는 데이터 값이 아니라 실질적으로는 질의 문장만을 가짐 

- 물리적인 테이블을 근거한 논리적인 테이블 (저장장치 내에 물리적으로 존재하지 않지만, 사용자에게 있는 것처럼 간주됨)

- 뷰는 기본 테이블에서 파생된 객체로서 기본 테이블에 대한 하나의 쿼리문(뷰 테이블 X, 뷰 쿼리 O)

- 사용자에게 주어진 뷰를 통해서 기본 테이블을 제한적으로 사용하게 됨

- 일단 정의된 뷰는 다른 뷰의 정의에 기초가 될 수 있음

- 뷰가 정의된 기본 테이블이나 뷰를 삭제하면 그 테이블이나 뷰를 기초로 정의된 다른 뷰도 자동으로 삭제됨

 

2. 장점

- DB의 선택적인 부분만 보여주므로 보안에 유리함

- 논리적 데이터 독립성 제공

- 동일한 데이터를 또 다른 뷰로 표현 가능

- 한 개의 뷰에 여러 테이블의 데이터를 검색 가능

- 한 개의 테이블로부터 여러 뷰를 생성 가능

 

3. 단점

- 독립적인 인덱스를 가질 수 없음

- 뷰의 정의를 변경할 수 없고, INSERT, UPDATE, DELETE의 DML 문에 많은 제한이 있음

- ALTER VIEW 문을 사용할 수 없음 즉, 뷰의 정의를 변경할 수 없음

 

 

[3] VIEW 문법 

- DDL 중 CREATE, DROP 로 뷰를 생성, 삭제 가능

- ALTER문을 사용해서 뷰를 변경하는 건 불가능

1. CREATE

1) 단일 테이블 VIEW

# 문법
CREATE VIEW 뷰이름[(속성이름, 속성이름)] AS 
    SELECT 컬럼명 
    FROM 테이블명 
    [WHERE 조건];
    
 # 예시
 # 고객 테이블에서 주소에 서울시를 포함하는 고객들의 성명과 전화번호를 서울고객이라는 뷰로 만들어라.
 CREATE VIEW 서울고객(성명, 전화번호) AS
     SELECT 성명, 전화번호
     FROM 고객
     WHERE 주소 LIKE '%서울시%';

 

* 예시

1-1) EMPLOYEE TABLE

EMP_NO NAME DEPT_NO
1111 A 1
2222 B 1
3333 C 2

 

# 하나의 테이블에서 특정한 조건에 맞는 레코드들만 질의
CREATE VIEW V_EMP AS 
    SELECT *
    FROM EMPLOYEE
    WHERE DEPT_NO = 1;

 

1-2) 위 쿼리의 결과 값 : V_EMP 

EMP_NO NAME DEPT_NO
1111 A 1
2222 B 1
# 하나의 테이블에서 특정한 컬럼들만 질의
CREATE VIEW V_EMP AS 
    SELECT EMP_NO, NAME 
    FROM EMPLOYEE;

 

1-3) 위 쿼리의 결과 값 : V_EMP 

EMP_NO NAME
1111 A
2222 B
3333 C

 

2) 복합 테이블 VIEW

 

- 여러 테이블의 JOIN 해서 하나의 테이블처럼 질의할 수 있도록 함

 

3) 옵션

3-1) WITH CHECK OPTION

- 조건 컬럼 값을 바꾸지 못하게 하는 옵션

- 뷰를 정의하는 서브 쿼리문에 WHERE 절을 추가하여 기본 테이블 중 특정 조건에 맞는 로우(행)만으로 구성된 뷰를 생성할 수 있음

- 이 때 WHERE 절에 WITH CHECK OPTION을 기술하면 그 조건에 의해 기본 테이블에서 정보가 추출되는 것이므로 사용 되어진 컬럼 값은 뷰를 통해 변경이 불가능

CREATE VIEW V_EMP AS
    SELECT EMP_NO, NAME, SAL
    FROM EMPLOYEE
    WHERE DEPT_NO = 1 
    WITH CHECK OPTION;  -- V_EMP 뷰에 새로운 행을 삽입하려고 할 때, DEPT_NO가 1이 아닌 경우 삽입/변경이 거부됨
    
# 급여가 500 이상인 사원을 2번 부서로 변경 쿼리
UPDATE VIEW V_EMP
SET DEPT_NO = 2
WHERE SAL > 500; -- 변경 불가, 조건에 사용되어진 컬럼을 변경하는것이기 때문에

 

3-2) WITH READ ONLY

- 기본 테이블의 어떤 컬럼에 대해서도 뷰를 통한 수정이 불가능하게 만드는 옵션 

CREATE VIEW V_EMP AS
    SELECT EMP_NO, NAME, SAL
    FROM EMPLOYEE
    WHERE DEPT_NO = 1
    WITH READ ONLY;
    
    
# WITH READ ONLY 옵션을 기술한 V_EMP 뷰의 SAL을 모두 2000으로 변경
UPDATE V_EMP
SET SAL = 2000;  -- 읽기 전용이라 DML 작업 수행 불가

 

 

2. DROP

* 뷰는 ALTER 문을 사용하여 변경할 수 없으므로 필요한 경우는 삭제한 후 재생성

# 문법
DROP VIEW 뷰 이름 RESTRICT or CASCADE

# 서울고객이라는 뷰를 삭제해라.
DROP VIEW 서울고객 RESTRICT;

 

1) RESTRICT

- 뷰를 다른 곳에서 참조하고 있으면 삭제가 취소됨

2) CASCADE

- 뷰를 참조하는 다른 뷰나 제약 조건까지 모두 삭제됨

'데이터베이스' 카테고리의 다른 글

[데이터베이스] JOIN(조인)  (0) 2024.07.10
[데이터베이스] RDBMS, NOSQL  (0) 2024.07.07
[데이터베이스] 기초 개념 정리  (0) 2024.07.07