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개의 댓글

관련 채용 정보