무거운 궁댕이 2024. 6. 6. 13:45

뷰의 개념

 뷰는 다른 테이블을 기반으로 만들어진 가상 테이블(virtual table)이다. 이렇게 부르는 이유는 일반 테이블과 달리 데이터를 실제로 저장하지 않기 때문이다.

 

 뷰를 만드는 데 기반이 되는 물리적인 테이블을 기본 테이블이라고 하는데 CREATE TABLE 문으로 정의한 테이블이 기본 테이블로 사용된다. 일반적으로 뷰는 기본 테이블을 기반으로 만들어지지만 다른 뷰를 기반으로 새로운 뷰를 만들 수도 있다.

 

 뷰를 통해 기본 테이블의 내용을 쉽게 검색할 수는 있지만 기본 테이블의 내용을 바꾸는 작업은 제한적으로 이루어진다.

 

뷰의 생성

#기본코드
CREATE VIEW 뷰_이름[(속성_리스트)] AS SELECT 문 [WITH CHECK OPTION];

 

예제 55

 고객 테이블에서 등급이 vip 인 고객의 고객아이디, 고객이름, 나이로 구성된 뷰를 우수고객이라는 이름으로 생성해보자. 그런 다음 우수고객 뷰의 모든 내용을 검색해보자.

#작성코드 / 정답코드와 동일
CREATE VIEW 우수고객(고객아이디, 고객이름, 나이) AS SELECT 고객아이디, 고객이름, 나이 FROM 고객 WHERE 등급 = 'vip' WITH CHECK OPTION;
SELECT * FROM 우수고객;

 

 뷰를 구성하는 속성의 이름과 기본 테이블에서 검색한 속성의 이름이 같으면 뷰를 구성하는 속성의 이름 리스트를 생략해도 된다.

 

 

예제 56

 제품 테이블에서 제조업체별 제품수로 구성된 뷰를 업체별제품수라는 이름으로 생성해보자. 그런 다음 업체별제품수 뷰의 모든 내용을 검색해보자.

#작성코드
CREATE 업체별제품수 AS SELECT 제조업체, COUNT(*) FROM 제품 GROUP BY 제조업체;
SELECT * FROM 업체별제품수;
#정답코드
CREATE VIEW 업체별제품수(제조업체, 제품수) AS SELECT 제조업체, COUNT(*) FROM 제품 GROUP BY 제조업체;
SELECT * FROM 업체별제품수;

 

 뷰를 구성하는 속성의 이름과 기본 테이블에서 검색한 속성의 이름이 다르므로 뷰를 구성하는 속성의 이름 리스트를 생략하면 안 된다.

 

 

예제 57

 우수고객 뷰에서 나이가 25세 이상인 고객에 대한 모든 내용을 검색해보자.

#작성코드 / 정답코드와 동일
SELECT * FROM 우수고객 WHERE 나이 >= 25;

 

 

 뷰가 데이터를 실제로 저장하고 있지 않는 가상 테이블이지만 SELECT 문을 이용해 데이터를 검색할 수 있다. 그 이유는 뷰에 대한 SELECT 문이 내부적으로는 기본 테이블에 대한 SELECT 문으로 변환되어 수행되기 때문이다.

 

 INSERT 문, UPDATE 문, DELETE 문도 뷰를 대상으로 수행할 수 있다. 그러나 삽입, 수정, 삭제 연산이 모든 뷰에 허용되는 것은 아니다. 뷰는 기본 테이블을 들여다 보는 창의 역할을 하기 때문에 뷰를 통한 기본 테이블의 변화는 제한적이다.

 

#예시1
CREATE VIEW 제품1 AS SELECT 제품번호, 재고량, 제조업체 FROM 제품 WITH CHECK OPTION;
SELECT * FROM 제품1;
#예시2
CREATE VIEW 제품2 AS SELECT 제품명, 재고량, 제조업체 FROM 제품 WITH CHECK OPTION;
SELECT * FROM 제품2;

 

예제58

 제품번호가 p08, 재고량이 1,000, 제조업체가 신선식품인 새로운 제품의 정보를 제품1 뷰에 삽입해보자. 그런 다음 제품1 뷰에 있는 모든 내용을 검색해보자.

#작성코드 / 정답코드와 동일
INSERT INTO 제품1(제품번호, 재고량, 제조업체) VALUES ('p08', 1000, '신선식품');
SELECT * FROM 제품1;
SELECT * FROM 제품;

 

 제품1 뷰에 있는 모든 내용을 검색하면 p08 제품에 대한 새로운 튜플이 삽입된 것을 확인할 수 있다. 또한 기본 테이블에도 같은 튜플이 삽입됐음을 알 수 있다. 뷰를 통해 값을 제시하지 않은 제품명 속성과 단가 속성에는 널 값이 저장된다.

 

#에러발생
INSERT INTO 제품2(제품명, 재고량, 제조업체) VALUES ('시원냉면', 1000, '신선식품);

 

 위 코드를 실행하면 에러가 발생한다. 그 이유는 제품 테이블의 키 값인 제품번호 속성은 NULL 값을 가질 수 없기 때문이다. UPDATE 문과 DELETE 문도 마찬가지다. 기본 테이블의 기본키 속성을 포함하고 있는 뷰는 수정과 삭제 연산이 모두 실행되지만, 기본키 속성을 포함하지 않는 뷰는 실행되지 않는다.

 

 변경이 불가능한 뷰의 중요한 특징 몇 가지를 살펴보면 다음과 같다.

 

1. 기본 테이블의 기본키를 구성하는 속성이 포함되어 있지 않은 뷰는 변경할 수 없다.

 

2. 기본 테이블에 있던 내용이 아니라 집계 함수로 새로 계산된 내용을 포함하고 있는 뷰는 변경할 수 없다.

 

3. DISTINCT 키워드를 포함하여 정의한 뷰는 변경할 수 없다.

 

4. GROUP BY 절을 포함하여 정의한 뷰는 변경할 수 없다.

 

5. 여러 개의 테이블을 조인하여 정의한 뷰는 변경할 수 없는 경우가 많다.

 

 사용함에 있어 많은 제한을 가지고 있는 뷰의 장점은 다음과 같다.

 

1. 질의문을 좀 더 쉽게 작성할 수 있다.

-> 특정 조건을 만족하는 튜플들로 뷰를 미리 만들어놓으면, 사용자가 WHERE 절 없이 뷰를 검색해도 특정 조건을 만족하는 데이터를 검색할 수 있다. 또한 GROUP BY, 집계 함수, 조인 등을 이용해 미리 뷰를 만들어놓으면, 복잡한 SQL 문을 작성하지 않아도 SELECT 절과 FROM 절만으로 원하는 데이터를 검색할 수 있다.

 

2. 데이터의 보안 유지에 도움이 된다.

-> 여러 사용자의 요구에 맞는 다양한 뷰를 미리 정의해두고 사용자가 자신에게 제공된 뷰를 통해서만 데이터에 접근하도록 권한을 설정하면, 뷰에 포함되지 않은 데이터를 사용자로부터 보호할 수 있다.

 

3. 데이터를 좀 더 편리하게 관리할 수 있다.

-> 제공된 뷰에 포함되지 않은 기본 테이블의 다른 부분은 사용자가 신경 쓸 필요가 없다. 또한 제공된 뷰와 관련이 없는 다른 테이블의 변화에도 영향을 받지 않는다.

 

뷰의 삭제

#기본코드
DROP VIEW 뷰_이름;

 

예제59

우수고객 뷰를 삭제해보자.

#작성코드 / 정답코드와 동일
DROP VIEW 우수고객;