뷰 ( View )
- 다른 테이블을 기반으로 만들어진 가상 테이블
- 뷰가 필요한 응용이나 사용자가 생기면 그때 기본 테이블 값을 기반으로 동적으로 만들어낸다
- 데이터를 실제로 저장하지 않고 논리적으로만 존재하는 테이블
- 다른 뷰를 기반으로 새로운 뷰 만드는 것 가능
- 뷰를 통해 기본 테이블 검색(SELECT) 가능 But 수정( UPDATE, DELETE, INSERT )은 제한적
뷰 생성: CREATE VIEW 문
CREATE VIEW 뷰_이름[(속성_리스트)]
AS SELECT 문
[WITH CHECK OPTION]
1. CREATE VIEW
- 생성할 뷰의 이름과 뷰를 구성하는 속성 이름 나열
- 속성리스트 생략 → SELECT 절에 나열된 속성 이름 그대로 사용
2. AS
- 기본 테이블에 대한 SELECT 문 작성
- SELECT문은 생성하려는 뷰의 정의를 표현
- ORDER BY는 사용 불가 ( ORDER BY는 출력할 때 의미 있기 때문 )
3. WITH CHECK OPTION
- 뷰에 삽입이나 수정 연산을 할 때 SELECT문에서 제시한 뷰의 정의 조건을 위반하면 수행되지 않도록 하는 제약조건을 지정
- 대부분의 CREATE VIEW문에 써야 한다
Ex)
CREATE VIEW 우수고객 (고객 아이디, 고객 이름, 나이)
AS SELECT 고객아이디, 고객이름, 나이
FROM 고객
WHERE 등급 = 'vip'
WITH CHECK OPTION;
→ 우수고객이라는 이 뷰를 쓰는 경우에만 동적으로 생성
→ WITH CHECK OPTION 때문에 뷰가 생성된 후에 우수고객 뷰에 vip 등급이 아닌 고객 데이터를 삽입하거나 뷰의 정의 조건을 위반하는 수정 및 삭제 연산을 시도하면 실행을 거부함
뷰 활용 : 검색 (SELECT 문)
뷰는 일반 테이블과 같은 방법으로 데이터 검색(SELECT) 가능 제한 X 검색 연산은 모든 뷰에 수행 가능
ex) SELECT * FROM 우수고객 WHERE 나이>=25;
뷰 활용 : 수정(INSERT, UPDATE, DELETE 문)
기본 테이블에 대해 수행되므로 기본 테이블이 변경되므로 제한적으로 수행됨변경 가능한 뷰와 변경 불가능한 뷰가 있다
변경 불가능한 뷰
- 기본 테이블의 기본키를 구성하는 속성이 포함되어 있지 않은 뷰 ← 기본키는 null이 돼서는 안 된다는 개체 무결성 제약조건 위반
- 기본 테이블에 있던 내용이 아닌 집계 함수로 새로 계산된 내용을 포함하는 뷰
- GROUP BY 절을 포함하여 정의한 뷰
- DISTINCT 키워드를 포함하여 정의한 뷰
- 여러 개의 테이블을 조인하여 정의한 뷰
Ex )
제품 2 뷰가 변경 불가능한 이유?
기본키가 없어 개체 무결성 제약 조건을 위반하기 때문
INSERT INTO 제품 1 VALUES ( 'P08', 1000, '신선식품');
→ 가능
INSERT INTO 제품 2 VALUES ( '시원냉면', 1000, '신선식품');
→ 오류 발생
→ 이유 : 제품2 뷰는 제품 테이블의 기본키인 제품번호 속성을 포함하고 있지 않기 때문
뷰 삭제 : DROP VIEW 문
DROP VIEW 뷰_이름 [CASCADE | RESTRICT];
삭제할 뷰를 참조하는 제약조건이 존재하는 경우
- RESTRICT ( 디폴트 ) : 뷰 삭제가 수행되지 않음
- CASCADE : 관련된 뷰나 제약조건을 모두 삭제함 → 위험
ex) DROP VIEW 우수고객
※ 뷰 변경 : ALTER VIEW 가 없는 이유
view는 drop 하고 다시 만들어도 데이터에 영향 없다
→ 변경이 필요할 때는 drop 하고 다시 만들면 된다!
뷰의 장점
1. 질의문을 좀 더 쉽게 작성할 수 있다
GROUP BY, 집계 함수, 조인 등을 이용해 뷰를 미리 만들어 놓으면, 복잡한 SQL문을 작성하지 않아도 SELECT절과 FROM 절만으로도 원하는 데이터 검색 가능
2. 데이터 보안 유지에 도움이 된다
자신에게 제공된 뷰를 통해서만 데이터에 접근하도록 권한 설정이 가능하다 ( Write가 제한된다 )
3. 데이터를 좀 더 편리하게 관리할 수 있다
제공된 뷰와 관련 없는 다른 내용에 대해 사용자가 신경 쓸 필요가 없다
데이터 독립성 : 기본 스키마를 개념 스키마, 뷰를 외부 스키마로 볼 때 개념 스키마를 바꿔도 외부 스키마에 영향이 없듯이 기본 스키마를 바꿔도 뷰에 영향 X