본문 바로가기

Domain/데이터베이스

[데이터베이스] 7. SQL의 View

View

View란 테이블에 대한 가상의 테이블로써 테이블처럼 직접 데이터를 소유하지 않고 검색 시에 이용할 수 있도록 정보를 담고 있는 객체를 의미합니다. 만약 특정 컬럼들을 여러 번 조회해야 한다면 똑같은 SELECT문을 여러 번 반복해야 하는데, 뷰에 해당 쿼리문을 저장함으로써 빠르고 간편하게 조회가 가능합니다. 자주 질의되는 SQL문을 View라는 가상 테이블로 저장.

View의 특징

  • 데이터의 논리적 독립성
    • 예를 들어, 기존의 instructor 테이블이 professor(pid, name, dept), lecturer(lid, name, major, address)로 분할되었다. 이때 View의 instructor 컬럼 리스트의 이름과 타입은 기존의 insturctor 테이블과 동일하므로 기존의 응용프로그램은 수정 없이 그대로 사용할 수 있다.
  • 데이터의 보안이 향상된다. 사용자들에겐 테이블 대신 뷰에 대한 접근 권한만 제공하는 방식.
  • 변경의 항시적 반영: 뷰의 정의(SQL 질의문)에 대한 질의 처리를 통해 데이터 계산이 이루어지므로 변경이 항시 자동 반영된다.
  • 성능상의 단점: 뷰에 대한 질의가 발생할 때마다 질의 처리가 이루어진다.
CREATE VIEW instructor(pid, name, dept) AS
	(SELECT * FROM professor)
    	UNION
    	(SELECT lid, name, major FROM lecturer);

 

예시. 전산학 과목들을 나타내는 View

CREATE VIEW cs_course (co_id, co_name, inst_name, prerequisite) AS
	SELECT C.id, C.name, c.prerequisite FROM cource C, instructor I
    	WHERE I.dept='cs' AND I.pid=C.insturctor;

위의 생성한 View에 대한 질의

SELECT co_id, co_name FROM cs_course
WHERE inst_name = '홍길동';

 

MySQL에서의 View 구현 방법

  1. TEMPTABLE: View의 정의에 대한 임시적인 테이블을 생성하고 이에 대해 질의를 실행
  2. MERGE: View에 대한 질의 사용 시, 질의와 view의 정의를 통합한 질의 생성
MySQL에서의 view의 특징: 테이블의 인덱스는 merge로 구현된 경우에만 적용가능하며, from절에는 중첩 질의가 불가능하다. 또한, view 정의 시 중첩 질의는 where 절에만 허용된다.
CREATE VIEW SalesPreOrder AS
	SELECT orderNumber, SUM(quantityOrdered * priceEach) total
    	FROM orderDetails
        GROUP BY ordeNumber
        ORDER BY total DESC;

 

MySQL에서의 Udatable View

아래의 조건을 만족하는 view는 갱신이 가능하다.

  1. View의 select문이 집계함수, join, union 등을 포함하지 않는 경우
  2. From절에 non-updatable view가 사용되지 않은 경우
  3. Merge 알고리즘을 사용한 경우
CREATE VIEW offiseInfo AS
SELECT offficeCode, phone, city FROM offices;


#view에 대한 갱신

UPDATE officeInfo
SET phone ='+33 14 723 5555'
WHERE officeCode=4;

DELETE FROM officeInfo WHERE officeCode=4;

 

View가 갱신 가능한 지 확인하는 방법

SELECT table_name, is_updatable
FROM information_schema.views
WHERE table_schema ='classicmodels';