728x90
뷰(View)
- 데이터베이스에 존재하는 일종의 가상 테이블이다
- 뷰는 사용자에게 접근이 허용된 자료만을 제한적으로 보여주기 위해 하나 이상의 기본 테이블로부터 유도된, 이름을 갖는 가상 테이블이다
- 뷰는 저장 장치 내에 물리적으로 존재하지 않지만, 사용자에게 있는 것처럼 간주되며 실제 테이블처럼 행과 열을 갖는다
- 뷰는 데이터 보정작업, 처리과정 시험 등 임시적인 작업을 위한 용도로 활용된다
- 즉, 뷰를 사용하면 여러 테이블이나 뷰를 하나의 테이블처럼 볼 수 있기 때문에 JOIN 문의 사용 최소화로 사용상의 편의성을 최대화한다
- MySQL에서 뷰(view)는 다른 테이블이나 다른 뷰에 저장되어 있는 데이터를 보여주는 역할만을 수행한다
- 뷰는 데이터 보정, 처리 과정 시험 등의 임시적인 작업을 위한 용도로 활용된다
뷰(View)의 특징
- 뷰는 기본 테이블로부터 유도된 테이블이기 때문에 기본 테이블과 같은 형태의 구조를 사용하며, 조작 또한 기본 테이블과 거의 동일하다
- 뷰는 가상 테이블이기 때문에 물리적으로 구현되어 있지 않다
- 데이터의 논리적 독립성을 제공할 수 있다
- 뷰를 통해서만 데이터에 접근하게 되면 뷰에 나타나지 않는 데이터를 안전하게 보호하는 효율적인 기법으로 사용할 수 있다
- 필요한 데이터만 뷰로 정의해서 처리할 수 있기 때문에 관리가 용이하고 명령문이 간단해진다
- 기본 테이블의 기본키를 포함한 속성(열) 집합으로 뷰를 구성해야지만 삽입, 삭제, 갱신, 연산이 가능하다
- 일단 정의된 뷰는 다른 뷰의 정의에 기초가 될 수 있다
- 뷰는 정의된 테이블에 종속적이다
- 뷰가 정의된 기본 테이블이나 뷰를 변경 또는 삭제하면 그 테이블이나 뷰를 기초로 정의된 다른 뷰도 자동으로 변경 또는 삭제된다
- VIEW는 TABLE과 달리 데이터가 없고 SQL만 저장하기 때문에 저장 공간을 차지하지 않는다
- 기본 테이블은 디스크에 공간이 할당되어 데이터를 저장한다
- 반면 뷰는 데이터 딕셔너리(Data Dictionary) 테이블에 뷰에 대한 정의 (SQL문)만 저장되어 디스크 저장 공간이 할당되지 않는다
- 뷰에 대한 수정 결과는 뷰를 정의한 기본 테이블에 적용된다
뷰의 종류
- 단순 뷰 : 하나의 기본 테이블 위에 정의된 뷰
- 복합 뷰 : 두 개 이상의 기본 테이블로부터 파생된 뷰
뷰(View)의 장단점
1) 장점
- 논리적 데이터 독립성을 제공한다
- 동일 데이터에 대해 동시에 여러 사용자의 상이한 응용이나 요구를 지원한다
- 사용자의 데이터 관리를 간단하게 해준다
- 특정 사용자에게 테이블 전체가 아닌 필요한 필드만을 보여줄 수 있다
- 한 개의 뷰로 여러 테이블에 대한 데이터를 검색할 수 있다
- 복잡한 쿼리를 단순화해서 사용할 수 있다
- 쿼리를 재사용할 수 있다
- ex) JOIN 쿼리문을 매번 작성하지 않고, 조회 쿼리문을 뷰로 생성해두고 뷰를 조회하는 것이 편하다!
- 접근 제어를 통한 자동 보안이 제공된다
- 뷰를 통해서만 데이터에 접근하게 되면 뷰에 없는 데이터를 안전하게 보호할 수 있다
2) 단점
- 독립적인 인덱스를 가질 수 없다
- ALTER VIEW 문을 사용할 수 없다 -> 즉, 뷰의 정의를 변경할 수 없다
- 뷰로 구성된 내용에 대해 삽입, 삭제, 갱신 연산에 제약이 따른다
- 단순 뷰인 경우 연산이 자유롭다
- 그러나 함수, UNION, GROUP BY 등을 사용한 복합 뷰인 경우 불가능하다
- (JOIN만 사용한 복합 뷰는 제한적으로 가능하다)
뷰(View) 예시
1) 뷰 정의문
--문법--
CREATE VIEW 뷰이름[(속성이름[,속성이름])] AS SELECT문;
--고객 테이블에서 주소가 서울시인 고객들의 성명과 전화번호를 서울고객이라는 뷰로 만들어라--
CREATE VIEW 서울고객(성명, 전화번호)
AS SELECT 성명 전화번호
FROM 고객
WHERE 주소 = '서울시';
- 뷰는 CREATE 문에 의해 정의되며, SYSVIEW에 저장된다
- 뷰의 이름을 명시하고, AS 키워드 뒤에 SELECT 문을 사용하여 해당 뷰가 접근할 수 있는 필드를 명시한다
- 이 때 WHERE 절을 사용하여 특정 조건을 설정할 수도 있다
- 단, ORDER BY는 사용할 수 없다
- 이를 통해 CREATE VIEW 문은 SELECT 문에서 선택된 필드를 갖는 새로운 뷰를 생성한다
1-1) 단일 테이블을 이용한 단순 View
2-2) 복합 테이블을 이용한 복합 View
2) 뷰 대체문
-- 문법 --
CREATE OR REPLACE VIEW 뷰이름 AS
SELECT 필드이름1, 필드이름2, ...
FROM 테이블이름
WHERE 조건
-- 예제 --
CREATE OR REPLACE VIEW MyView AS
SELECT Name, RoomNum, Date - Curdate() AS Dday
FROM Reservation;
- CREATE OR REPLACE VIEW 문은 OR REPLACE 절이 추가된 것을 제외하면, 뷰를 생성하는 문법과 동일하다
- 이 때 해당 뷰가 존재하지 않으면 CREATE VIEW 문과 같은 결과를 반환한다
- 위의 예제는 MyView 뷰 테이블에서 ReserveDate 필드를 RoomNum 필드로 대체하는 예제이다
3) 뷰 삭제문
--문법--
DROP VIEW 뷰이름 RESTRICT or CASCADE
--서울고객이라는 뷰를 삭제해라--
DROP VIEW 서울고객 RESTRICT;
- 뷰는 삭제할 때는 DROP 문을 사용한다
- 뷰는 ALTER 문을 사용하여 변경할 수 없으므로, 변경이 필요한 경우에는 기존의 뷰를 삭제한 후 재생성한다!
- 뷰를 삭제해도 기본 테이블은 영향을 받지 않는다
💡 뷰 삭제 문법
- RESTRICT : 뷰를 다른 곳에서 참조하고 있으면 삭제가 취소된다
- CASCADE : 뷰를 참조하는 다른 뷰나 제약 조건까지 모두 삭제된다
뷰 옵션
1) WITH CHECK OPTION
- 조건 컬럼값을 변경하지 못하게 하는 옵션이다
- 뷰를 정의하는 서브 쿼리문에서 WHERE 절을 추가하여 기본 테이블 중 특정 조건에 만족하는 행으로만 구성된 뷰를 생성할 수 있다
- 이 때 WHERE 절에 WITH CHECK OPTION을 기술하면 그 조건에 의해 기본 테이블에서 정보가 추출되는 것이므로 조건에 사용되어진 컬럼 값은 뷰를 통해서는 변경이 불가능하다
2) WITH READ ONLY
- 기본 테이블의 어떤 컬럼에 대해서도 뷰를 통한 내용 수정을 불가능하게 만드는 옵션이다
뷰 활용
1) SELECT 문
- 뷰는 일반 테이블과 같은 방법으로 원하는 데이터 검색이 가능하다
- 뷰에 대한 SELECT 문이 내부적으로는 기본 테이블에 대한 SELECT 문으로 변환되어 수행된다
- 검색 연산은 모든 뷰에 대해 수행이 가능하다
2) INSERT, UPDATE, DELETE 문
- 뷰에 대한 삽입, 수정, 삭제 연산은 실제로 기본 테이블에 수행되어 결과적으로 기본 테이블이 변경된다
- 뷰에 대한 수정 결과는 뷰를 정의한 기본 테이블에도 적용된다
- 그러나 뷰를 정의한 기본 테이블에서 정의된 무결성 제약 조건은 그대로 유지된다
- 뷰에 대한 삽입, 수정, 삭제 연산은 제한적으로 수행된다
- 무결성 제약 조건, 표현식, 집단 연산, group by 절의 유무에 따라 DML 문 사용이 제한적이다
- 변경 불가능한 뷰의 특징
- 기본 테이블의 기본 키를 구성하는 속성이 포함되어 있지 않은 뷰
- 기본 테이블에 있던 내용이 아닌 집계 함수로 새로 계산된 내용을 포함하는 뷰
- DISTINCT 키워드를 포함해 정의한 뷰
- GROUP BY 절을 포함해 정의한 뷰
- 여러 개의 테이블을 조인하여 정의한 뷰는 변경 불가능한 경우가 많다
💡 View 사용 시 꿀팁
복합 뷰(Nested View)를 최소화하라!
> 뷰는 엄청난 쿼리를 사용자들로부터 가리는데 좋지만, 하나의 뷰 안에 또 다른 뷰와 내부에 있는 다른 뷰를 계속해서 중첩시키다보면 심각한 성능 저하를 유발할 수 있다
> 너무 많은 수의 복합 뷰는 모든 쿼리에 대해 엄청난 양의 데이터가 반환되는 결과를 초래하여 DB 성능을 저하시킬 수 있다
> 심각해지면 쿼리 최적화기(Optimizer)가 포기해서 아무것도 반환되지 않을 수 있다
> 따라서 복합 뷰를 풀어내는 것으로 쿼리 응답 시간을 몇 분에서 몇 초로 줄일 수 있다
참고)
https://coding-factory.tistory.com/224
http://www.tcpschool.com/mysql/mysql_view_createReplace
https://helloworld92.tistory.com/75
https://ahnty0122.tistory.com/129
728x90
'야미스터디 > Database' 카테고리의 다른 글
[DB] Redis 📌 (0) | 2022.09.13 |
---|---|
[DB] SQL Injection 📌 (0) | 2022.08.31 |
[DB] DDL, DML, DCL 📌 (0) | 2022.08.10 |
[DB] RDB vs NoSQL 📌 (0) | 2022.08.04 |
[DB] DB Index 📌 (0) | 2022.07.17 |
댓글