[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 |