2. TODO
• View 에 대한 개념 이해하기
• View는 생성 및 조회 방법에 대해 알아보기
• View를 이용한 데이터의 삽입, 삭제, 갱신의 어려움에 대해
알아보기.
3. Definition
In database theory, a view is the result set of a stored query on the data,
which the database users can query just as they would in a persistent
database collection object. This pre-established query command is kept in the
database dictionary. Unlike ordinary base tables in a relational database, a
view does not form part of the physical schema: as a result set, it is a virtual
table computed or collated dynamically from data in the database when
access to that view is requested. Changes applied to the data in a relevant
underlying table are reflected in the data shown in subsequent invocations of
the view.
- Wikipedia, “VIew(SQL)”, https://en.wikipedia.org/wiki/View_%28SQL%29, 2015.08.17
4. Definition
• 가상 테이블(Virtual Table)
• 기존 생성된 테이블들의 데이터들을 조합하여 하나의 테이블로 출력
• 일반 테이블과는 달리, 물리적으로 생성되지 않음
• 데이터베이스는 View를 정의한 Query만 가지고 있음
• 본래, 데이터를 조회하기 위한 용도로 사용
• But, 표준이 변경되어 View에 직접 삽입/갱신/삭제가 가능하게 되었음
5. Pros and Cons
• 단순화
• JOIN이 필요한 경우, 테이블들을 JOIN 한 VIEW 를 미리 정의하여 VIEW
를 생성하여 사용할 수 있음
• VIEW 정의 시 사용한 테이블에 삽입/갱신/삭제 연산이 발생하면 VIEW
에서도 반영
• 보안
• View 에 나타난 데이터만 접근 가능하기 때문에 나타나지 않는 데이터
는 사용할 수 없음
• 또한, View 정의 시 Column(Field) 이름 변경이 가능하여 실제 물리적 테이블
과 다른 이름을 가질 수 있음
6. Pros and Cons
• Index를 가질 수 없음
• View는 Virtual Table, 즉, 실제 데이터가 존재하는 테이블이 아니기 때
문에 Index를 가질 수 없음.
• 단, MSSQL, Oracle 에서는 Index를 지원하는 View type이 있음.
(MSSQL: Indexed View / Oracle: Materialized View)
• 한번 정의한 View 는 변경할 수 없음
• 삭제 후 다시 정의해야 함
• View에 데이터 삽입, 갱신, 삭제에 많은 제약이 따름
• View 구성에 따라 달라짐
7. View Types
• 단일뷰(Single Table View / Single View)
• 1개의 테이블을 이용해 View를 구성한 경우
• 일반적인 테이블과 같이 삽입/갱신/삭제 가능
• 복합뷰(Multiple Table View / Complex View)
• 2개 이상의 테이블을 이용해 VIew를 구성한 경우
• 삽입/갱신/삭제에 제약조건 존재
• INNER JOIN 사용 시: 삽입/갱신/삭제 가능하나 제약조건 존재
• OUTER JOIN / UNION 사용 시: 삽입 불가, 갱신/삭제 가능.
- MySQL의 경우, View Algorithm이 merge로 설정되어 있어야 함
8. View Types
• 복합뷰(Multiple Table View / Complex View)
• INNER JOIN 사용 시
• 삽입(Insert): 같은 테이블에 있는 Column 끼리만 가능
• 갱신(Update): 같은 테이블에 있는 Column 끼리만 가능
• 삭제(Delete): 삭제 불가
• OUTER JOIN 사용 시
• 삽입(Insert): 불가
• 갱신(Update): 같은 테이블에 있는 Column 끼리만 가능
• 삭제(Delete): 삭제 불가
9. Example Tables
순번 이름 팀 번호
1 권혁 1993
2 이범호 2001
3 필 2001
4 박병호 2010
5 양준혁 NULL
순번 팀 번호 팀명
1 1993 한화
2 1999 두산
3 2001 기아
4 2010 넥센
baseball_player baseball_team
A B
10. CREATE VIEW
• CREATE VIEW 구문 이용
CREATE VIEW view_kbo_info AS
SELECT player.id, player.name AS player_name, player.team_no, team.name AS team_name
FROM baseball_player AS player
INNER JOIN baseball_team AS team ON player.team_no = team.team_no
id player_name team_no team_name
1 권혁 1993 한화
2 이범호 2001 기아
3 필 2001 기아
4 박병호 2010 넥센
view_kbo_info
View 테스트: MySQL 5.5.43 / ubuntu 14.01
11. CREATE VIEW
• WITH CHECK OPTION
• View에 의해 접근 가능한 행(ROW)만이 입력되거나 변경될 수 있음
• View의 WHERE 절에 명시한 조건을 따름
• WITH READ ONLY
• 생성한 View는 오직 읽기만 가능(Read-Only): Oracle에서 지원
• 삽입, 삭제 불가
12. SELECT VIEW
SELECT *
FROM view_kbo_info
WHERE team_no = 2001;
id player_name team_no team_name
2 이범호 2001 기아
3 필 2001 기아
view_kbo_info
• 가상 테이블도 테이블의 한 종류이기 때문에, 일반 테이블 조
회하는 방법과 동일
View 테스트: MySQL 5.5.43 / ubuntu 14.01
13. INSERT VIEW
• INNER JOIN 일 경우, 제한적으로 삽입 가능
• OUTER JOIN일 경우, 삽입 불가
• 삽입할 컬럼이 같은 테이블로 구성되어 있을 경우에만 가능
INSERT INTO view_kbo_info(id, player_name, team_no) VALUES (6, '유희관', 1999)
INSERT INTO view_kbo_info(id, player_name, team_no, team_name) VALUES (7, '서건창', 2010, '넥센')
id player_name team_no team_name
1 권혁 1993 한화
2 이범호 2001 기아
3 필 2001 기아
4 박병호 2010 넥센
6 유희관 1999 두산
view_kbo_info
=> 오류. {id, player_name, team_no}, {team_name} column은
각각 다른 테이블에 속해있기 때문에 삽입 불가.
View 테스트: MySQL 5.5.43 / ubuntu 14.01
14. Update View
• INNER JOIN, OUTER JOIN 적용된 View에서 가능
UPDATE view_kbo_info SET team_name='해태' WHERE team_no=2001
id player_name team_no team_name
1 권혁 1993 한화
2 이범호 2001 해태
3 필 2001 해태
4 박병호 2010 넥센
6 유희관 1999 두산
view_kbo_info
UPDATE view_kbo_info SET team_no=1993, team_name='한화' WHERE id=2
=> 오류. {id, player_name, team_no}, {team_name} column은 각각 다른 테이블에 속해있음.
즉, UPDATE시 다른 테이블에 있는 값을 동시에 업데이트 하려 했기 때문에 오류 발생.
View 테스트: MySQL 5.5.43 / ubuntu 14.01
15. DELETE VIEW
• INNER JOIN, OUTER JOIN 모두 삭제 불가
• JOIN 연산으로 결합되어 VIEW 가 구성되어 있기 때문에, 어떤 테이블
의 항목을 삭제할 지 알 수 없음.
View 테스트: MySQL 5.5.43 / ubuntu 14.01
16. Conclusion
• View를 효율적으로 사용하면 Query 단순화가 가능
• 공통으로 사용하는 복잡한 Query의 중복 사용 횟수 단축 가능
• View는 되도록이면 데이터 조회 시에만 사용
• View에 삽입, 갱신, 삭제는 많은 제약(Restricts)이 따르기 때문에
View를 생성하는데 사용한 Table 에 직접 수행
• 갱신 결과는 View에 곧바로 반영됨