SQL 뷰
• SQL에서 뷰의 개념
• SQL에서 뷰의 명시
• SQL에서 뷰의 명시
• 뷰의 구현과 갱신
• 뷰 (views)
– SQL에서는 SELECT 명령의 결과인 투플들의 집합을 뷰로 지정할 수 있음 – 즉, 뷰는 다른 테이블 (혹은 이전에 정의한 뷰)에서 유도된 단일 테이블임
– 사용자는 전체 데이타베이스 보다는 자신이 관심을 가지고 있는 일부 데이타베이 스를 뷰로 정의하여 사용하는 것이 편리함
– 뷰는 가상적인 테이블로서 기본 테이블과 같이 물리적인 형태로 저장되지는 않음
SQL에서 뷰의 개념
– 뷰는 가상적인 테이블로서 기본 테이블과 같이 물리적인 형태로 저장되지는 않음 – 뷰의 튜플들은 실제로 저장되지 않으므로 뷰에 적용할 수 있는 갱신 연산들을 제
한됨
– 그러나, 뷰에 대한 질의는 기본 테이블에 대한 질의와 동일하게 작성할 수 있음
• 뷰의 생성
– CREATE VIEW 문장을 사용하여 뷰를 생성함
– 뷰는 뷰이름, 애트리뷰트 이름 리스트, 뷰의 내용을 지정하는 질의로 구성
– 뷰의 애트리뷰트 이름은 생략할 수 있으며, 이 경우 묵시적으로 기본 테이블의 애트리뷰트 이름과 동일 하게 지정됨
(1) CREATE VIEW WORKS_ON1
AS SELECT FNAME, LNAME, PNAME, HOURS
SQL에서 뷰의 명시
AS SELECT FNAME, LNAME, PNAME, HOURS FROM EMPLOYEE, PROJECT, WORKS_ON WHERE SSN=ESSN AND PNO=PNUMBER ;
(2) CREATE VIEW DEPT_INFO ( DEPT_NAME, NO_OF_EMPS, TOTAL_SAL) AS SELECT DNAME, COUNT (*), SUM (SALARY)
FROM DEPARTMENT, EMPLOYEE WHERE DNUMBER=DNO
GROUP BY DNAME ;
– (1)에서는 뷰 WORKS_ON1을 생성할 때 뷰의 애트리뷰트 이름을 지정하지 않았음; 이 경 우 뷰의 애트리뷰트 이름은 SELECT 리스트에 나열된 것과 동일함
– (2)에서는 뷰 DEPT_INFO에 새 애트리뷰트 이름을 명시적으로 지정하였음; 여기서 새 애 트리뷰트는 SELECT 절에서 지정한 애트리뷰트와 일대일로 대응해야 함
• SQL에서 테이블 위치에는 뷰가 대신 사용될 수 있음
예) 'ProjectX'에 참여하는 모든 종업원들의 성과 이름을 구하려면 아래 예제처럼 WORKS_ON1 뷰를 이용하여 질의를 지정할 수 있다.
SELECT PNAME, FNAME, LNAME FROM WORKS_ON1
WHERE PNAME='ProjectX’ ;
SQL에서 뷰의 명시(cont.)
WHERE PNAME='ProjectX’ ;
• SQL에서 뷰를 사용하면 질의 작성이 단순해짐
– 위 질의를 기본 릴레이션을 이용하여 작성하는 경우 두 개의 조인을 사용해야 함
• 뷰의 최신성
– 뷰는 SQL 질의에서 참조될 때마다 기본 테이블을 이용하여 계산되므로 항상 최 신의 정보를 제공함
– 즉, 만약 뷰의 정의에 사용된 기본 테이블의 튜플들이 수정되어도 뷰는 자동적으 로 이들 변경 사항들을 반영함
• 뷰의 특성
– 뷰를 최신 정보로 유지시키는 것은 사용자가 아니라 DBMS의 책 임임
– 뷰는 정의할 때 튜플들로 생성되는 것이 아니라 질의에서 뷰를 지정할 때 비로소 계산되어 생성됨
예) SELECT PNAME, FNAME, LNAME FROM WORKS_ON1
SQL에서 뷰의 명시(cont.)
FROM WORKS_ON1
WHERE PNAME='ProjectX’ ;
• 뷰의 삭제
– 뷰가 더 이상 필요하지 않다면 DROP VIEW 명령으로 제거함 예) DROP VIEW WORKS_ON1 ;
DROP VIEW DEPT_INFO ;
– 뷰는 보안기법의 일종으로 사용될 수도 있음 : 사용자에게 관련
데이터만 제공함
• 뷰의 구현 방식 – 두가지
– 질의수정(query modification) 방식
• 뷰에 대한 질의를 기본 테이블들에 대한 질의로 변 환하여 처리하는 방식
• 질의 변환 시간과 노력이 문제임
– 뷰의 실체화(view materialization) 방식
• 처음 질의에서 뷰에 대한 요구가 있을 때 임시 뷰
뷰의 구현과 갱신
• 처음 질의에서 뷰에 대한 요구가 있을 때 임시 뷰 테이블을 물리적으로 생성하고, 뷰에 다른 질의들 이 이어질 것이라는 가정 하에 테이블을 생성하여 유지하는 방식
• 베이스 테이블이 변경되면 뷰도 변경해야 하므로
오버헤드가 적은 점진적 갱신(incremental update)
기법이 필요함
• 뷰의 갱신
– 하나의 기본 테이블에서 정의된 뷰의 갱신은 기본 릴레이션들에 대한 갱신으로 매핑할 수 있음
– 그러나 조인을 이용하여 정의한 뷰의 갱신은 뷰의 구현과 갱신
– 그러나 조인을 이용하여 정의한 뷰의 갱신은 모호한 문제가 발생함
예) 뷰 WORKS_ON1에서 'John Smith'의 PNAME 애트리뷰트를
'ProductX'에서 'ProductY'로 갱신하는 예
UPDATE WORKS_ON1
SET PNAME='ProductY’
WHERE LNAME='Smith' AND FNAME='John' AND PNAME='ProductX’ ;
Smith John ProductX Smith John ProductY
• 이 질의는 기본 릴레이션에 대한 갱신으로 변환하는데 모호함이 있음
방법 1 : 'John Smith'와 관련된 PROJECT의 'ProductX' 튜플을 'ProductY' 튜 플의 PNO로 갱신함 - 요구한 갱신과 가장 유사함
UPDATE WORKS_ON
SET PNO = (SELECT PNUMBER FROM PROJECT WHERE PNAME='ProductY’ ) WHERE ESSN = (SELECT SSN FROM EMPLOYEE
뷰의 구현과 갱신 (cont.)
WHERE ESSN = (SELECT SSN FROM EMPLOYEE
WHERE LNAME='Smith' AND FNAME='John’ ) AND PNO = (SELECT PNUMBER FROM PROJECT
WHERE PNAME='ProductX’ ) ;
P20 'ProductX'
123456789 P25 ProductY
ESSN PNumber PName
Pno PName
Works_on Project
P20
P25 'ProductX'
(2)
(1)
방법 2 : PROJECT 릴레이션에서 'ProductX' 튜플을 찾아 PNAME을 'ProductY'로 갱신하라.
UPDATE PROJECT
SET PNAME='ProductY’
WHERE PNAME='ProductX’ ;
• 의미없는 뷰 갱신 / 모호한 갱신
뷰의 구현과 갱신(cont.)
• 의미없는 뷰 갱신 / 모호한 갱신
– 뷰의 갱신이 무의미한 경우가 있음
– 예를 들어, DEPT_INFO의 TOTAL_SAL 애트리뷰트는 각 종업원들 봉급의 합으로 정의 되었기 때문에 이 애트리뷰트의 갱신은 타당하지 않음
예) UPDATE DEPT_INFO
SET TOTAL_SAL=100000 WHERE DNAME='Research’ ;