본문 바로가기

ComputerScience/Database 이론

[Database] 7-2. View 개념 정리

728x90

 

안녕하세요. CS지식 정리도 할 겸, 학교에서 배운 데이터베이스 개념 + "데이터베이스 개론-IT COOKBOOK" 의 책을 공부하며 알게 된 내용을 정리하려고 합니다. 지난 포스트 "SQL 개념정리 | SQL의 DDL, DML 명령어 정리"에 이어 이번에는 Database의 View에 관한 개념을 정리해보려고 합니다. 주관적으로 작성된 글이기에 틀린 내용이 있을 수 있습니다.(댓글로 알려주시면 감사합니다:)

"이미 존재하던 table이 있는데 왜 View를 사용하는 것일까?"

Database에서 View는 다른 테이블들을 기반으로 만들어진 가상 테이블입니다. 이 가상 테이블을 실제 테이블처럼 on-disk에 저장하지 않고 memory에 저장해서 논리적으로 존재하는 테이블입니다. on disk(HDD, SSD...)의 경우 비 휘발성의 특징이 있고 in-memory에 저장하는 경우 휘발성인 특징이 있습니다. ( 전원이 꺼지면 날라갑니다. )

 

View는 subquery, group by등의 키워드를 통해 생성될 수 있습니다.

 

실제 테이블에서 보여서는 안 될 민감한 정보는 query에서 제외한 후 일부 사용자에게 제공할 수도 있습니다. 매번 복잡한 쿼리를 작성하는 것보다 View를 만들으로 select query를 단순하게 만들 수 있습니다. 데이터 갱신도 가능합니다.(물론 제한적이긴 합니다.)

 

View를 활용해 또 다른 View를 만들 수 있습니다.

Create View

Create View 뷰이름[속성_리스트]
As Select ...
[With Check Option]

 

기존 테이블의 Select문을 기반으로 한 결과 table로 View가 Create됩니다. Select문 활용하는 것은 이전 포스트에서 많이 다뤘습니다. 

 

뷰 역시 바로 문제를 풀며 익혀가는게 빠른 것 같습니다.

 

제품 테이블
제품번호 제품명 재고량 단가 제조업체
p01 그냥만두 5000 4500 대한식품
p02 매운쫄면 2500 5500 민국푸드
p03 쿵떡파이 3600 2600 한빛제과
p04 맛난초콜릿 1250 2500 한빛제과
p05 얼큰라면 2200 1200 대한식품
p06 통통우동 1000 1550 민국푸드
p07 달콤비스킷 1650 1500 한빛제과

 

제품 테이블이 있을 때

 

문제1. 제품 테이블에서 제품번호 개수가 2 이상인 제조업체별 제품수로 구성된 뷰를 업체별제품수라는 이름으로 생성해보자. 그런 다음 업체별제품수 뷰의 모든 내용을 검색해보자.

 

Create View 업체별제품수(제조업체, 제품수)
As Select 제조업체, Count(제품번호)
   From 제품
   Group By 제조업체 Having Count(제품번호) >= 2
With Check Option;

Select * From 업체별제품수;

 

업체별제품수View
  제조업체 제품수
1 대한식품 2
2 민국푸드 2
3 한빛제과 3



여기서 With Check Option은 View에 대한 DML작업 시 View에 설정된 조건을 확인해 해당 조건을 만족해야만 DML이 가능한 옵션입니다. 저 qeury에서는 업체별제품수 View에는 Having Count(제품번호) >= 2 조건이 설정되어 있습니다. DML을 하기 위해서는 제품번호가 2이상이어야 합니다.

 

하지만!!!! 업체별제품수 View 경우에는 제품 table의 PK(Primary Key)를 갖고 있지 않습니다. 그래서 With Check Option이 유효하지 않습니다.

With Check Option

뷰에 DML중 Insert, Update, Delete 명령어는 제한적으로 수행됩니다. 특정 조건이 만족되지 않을 경우 위의 경우처럼 With Check Option이 유효하지 않게 됩니다. 그 이유는 View에 DML을 하게 됬을 때 실제 기본 테이블이 변경되기 때문입니다.

 

변경 불가능한 View

  • As Select로 결과 table로 View를 생성할 때 Select의 table의 PK가 View의 속성으로 있어야 합니다.
  • 또한 Not Null 타입인 속성도 View에 같이 존재해야 합니다.
  • 새로운 데이터를 결과 table에 반영하는 집계 함수(Count, Avg, max etc...)나 (중복 제거하는)Distinct, Group By 절을 포함해서 정의한 뷰
  • 여러 테이블을 join해서 정의한 뷰

집계함수나 Group By등을 사용한 View는 기본 테이블에 대한 변경이 모호해집니다. 따라서 실제 기본 테이블에 영향을 주지 않도록 보장하기 위해 사용되는 옵션입니다.

 

위의 조건을 만족한 View가 생성되었다면 Insert, Update, Delete가 가능합니다.

 

뷰를 삭제할 경우

 

Drop View View_이름;

// ex)
// Drop View 업체별제품수;

 

위와 같은 명령어를 사용하면 됩니다. 

 

그러나 다른객체에 의존적이거나, 다른 session에서 View를 사용중이거나, 권한 부족 or 데이터베이스에서 설정된 제약조건에 따라 삭제가 수행되지 않을 수 있습니다.

 

 

틀린 부분 발견 시 댓글로 남겨주시면 정말 감사합니다.

728x90