MySQL - Views

김법우·2021년 12월 10일
0

Database

목록 보기
5/12
post-thumbnail

View 테이블 정의

View 는 하나의 가상 테이블이다. 잘 정의된 Relation Architecture 를 가지는 경우에 굳이 왜 View 를 쓰는걸까?
View 는 보통 복잡한 쿼리를 간단하고 가시적이게 만들 수 있으며 민감한 데이터에 접근하는 것을 제한하는 방법을 제공하기 때문에 더 나은 Database 접근과 조회를 제공 할 수 있다.

  • 3단계 데이터베이스 시스템에서 External View 는 Conceptual View 의 Subset 으로서 External Schema 로 정의한다.
  • 데이터베이스 응용 업무별로 상이한 External View 를 갖는다.
    • External View 는 Conceptual Schema 의 Base Table 또는 View Table 의 집합으로 정의된다.

View 테이블은 실제하는가?

View 테이블은 Named, Drived, Virtual Table 이다. 명명된, 유도된 가상 테이블인데 Create View ... 을 통해서 정의 할 수 있다.

실제로 Create View ... 를 한다고 table 이 생성되는 것이 아니고 테이블의 정의문이 System Catalog(Schema)에 저장된다.

  1. 실제하지는 않지만 show tables; 를 통해 확인은 가능하다.
  2. desc view_names; 를 통해 view 의 구조 또한 확인이 가능하다.

그렇다면 View 의 실제 동작은?

만약 view 의 정의가 하단과 같을 때,

Create View goot_suppliers as 
	select sno, city
	from s
	where status > 15;

실제로 select ... 은 실행되지 않고 schema 에 저장된다.

여기서 view table 은 real table에 대한 window 효과를 제공하는데 view 는 base table 의 내용이 변경되면 view 에서도 확인 가능하므로 window 는 Dynamic 하다

  1. real table 변경 → view 또한 반영

이렇게 만들어진 View table 에 대해 다시 Select 문을 적용 할 수 있다.

select * 
from good_supplier
where city != 'London';

사실 잘 생각해보면 good_supplier 안의 select 문 결과에 그냥 and 한 것과 같다는 걸 알 수 있다.

select *
from (
	select sno, status, city 
	from s
	where status > 15
) and city != 'London';

그렇다면 View 의 내용을 재정의 하고 싶다면 어떻게 해야 할까?

alter view good_supplier as select sno, city from s where status > 15;

View 를 제거하고 싶을 때는?

drop view if exists good_supplier;

View 의 사용

View 를 사용하는 이유는?

  • 논리적 데이터 독립성 지원
    • Conceptual Schema 가 변경되어도 External Schema 가 변경되지 않는것.
    • 응용 프로그램이 변경되지 않음
    • Base Table 의 변경 종류
      • Growth : base table 에 새로운 columns 이 추가
      • Reconstructing : base table 을 split, join 하는 경우
  • 복잡한 JOIN 처리를 View 테이블로 미리 정의하여 간단한 Select 문 사용 가능
  • 민감 데이터는 View 의 조건으로 접근을 제한

Insert

View 테이블에 Insert 를 할려면?

insert into good_supplier values(‘s10’,100,’Busan’);

view 에 대한 insert 는 base table 에 대한 insert 로 처리되게 된다.

하지만 view table 에서는 새로 insert 된 레코드가 view 의 조건을 만족하지 않을수도 있다. 이때는 view 에서는 새로 삽입된 record 가 보이지 않는다.

이런 경우처럼 insert 하고자 하는 record 가 view 조건을 만족하지 않는 경우 base table 에도 insert 되지 않게 하기 위해서는,

create view bad_supplier as
 select sno, status, city from s where status < 10 with check option;

with check option; 을 사용해 view 정의 단계에서 미리 처리한다.

물론 insert 할 때 view 가 base table 의 PK 를 포함하고 있어야 가능하다.

  1. pk 를 포함하고 있는 경우 가능
  2. Aggregate Function 이 사용되지 않는 경우

이는 JOIN view 에 대한 경우에도 마찬가지로,

create view ssp as select * from s join sp on s.sno=sp.sno;
select * from ssp;
insert into ssp values(‘s1’,’Hong’,10,’Busan’,’p1,10);
insert into ssp values(‘s11’,’Hong’,10,’Busan’,’p11,10);

위는 1:N 관계에 대한 join view 의 insert 구문이다.

Update

view 의 update 는 view 의 레코드와 base table 의 record 가 반드시 1:1 대응관계일때만 가능하다.

  • View 가 sum() 과 같은 Aggregate Function 을 포함 하는 경우 불가능
  • Distinct, group by, having, union, subquery, join 등 포함하는 경우 불가능
profile
개발을 사랑하는 개발자. 끝없이 꼬리를 물며 답하고 찾는 과정에서 공부하는 개발자 입니다. 잘못된 내용 혹은 더해주시고 싶은 이야기가 있다면 부디 가르침을 주세요!

0개의 댓글