DB

뷰 가상테이블

sdafdq 2023. 11. 9. 10:51

단순 뷰 : 하나의 테이블과 연관된 뷰

복합 뷰 : 2개 이상 테이블

 

뷰는 가상 테이블로, 바로가기와 비슷. 데이터를 가지고 있지 않음.

뷰는 select에 의해 만들어짐. 

 

create view v_member as select mem_id, mem_name, addr from member;

select * from v_member;

 

테이블 생성할 때 처럼

create view 뷰네임 as select 가져올데이터1, 가져올데이터2, .... from 테이블

 

조회는 테이블이랑 똑같음. 그냥 테이블이라고 생각 하셈.

 

그러니까 저 select 문을 저장해 뒀다가 뷰를 조회하는 순간 저 쿼리를 날려 가져오는 듯.

 

 

create view v_member_buy as select b.mem_id, m.mem_name, b.prod_name, m.addr, concat(m.phone1, m.phone2) '연락처' from buy b join member m on b.mem_id = m.mem_id;

select * from v_member_buy;

이렇게 복합뷰로 바로가기로 만듦.

 

마치 테이블 생성하듯이 영구히 남음.

 

select 처럼 별칭을 가져올 수 있는데, 

뷰도 그렇게 별칭으로 가져올 수 있는데, 

create view v_viewtest1 as select b.mem_id 'Member ID', m.mem_name as 'Member Name', b.prod_name 'Product Name', concat (m.phone1, m.phone2) as 'Office Phone' from buy b join member m on b.mem_id = m.mem_id;

저 별칭으로 테이블이 생성된다고 생각하면 된다.

 

그럼 저 별칭으로 가져올 수 있다.

 

그리고 조회 해 올때도 저 별칭을 지정해서 가져올 수도 있는데,

이때는 백틱으로 지정해야 한다.

select `Member ID`, `Member Name` from v_viewtest1;

이렇게 하면 저 별칭 문자 자체를 지정해서 가져온다.

 

또, 뷰는

새로 만들 때 

drop view if exists 뷰명

이렇게 하고 create view.... 했었는데,

create or replace view 뷰이름 as select ~~~

 

뷰는 이렇게 하예 하나로 가능하다.

테이블은 안된다.

 

desc 뷰네임

해서 뷰의 열에 대한 정보도 볼 수 있다.

근데 뷰는 신기한 점이 primary key는 따로 없다. not null도 아니다. 그냥 select 해서 값만 가져오는 거기 때문에...

 

 

또 뷰에 대한 정보 자체를 볼 수 있다.

show create view 뷰네임

 

이렇게 하면 뷰네임, 뷰 생성 알고리즘 해서 어떤 테이블로 부터 어떤 열을 어떤 별칭으로 사용하는 지 등 나온다.

 

참고로 뷰를 통해 update나 insert가 가능하다.

근데 이게 뷰로 들어가는게 아니라 원본 테이블로 들어간다.

아까 말했다 시피 뷰는 바로가기, 일종의 select문을 저장해놓는? 그런 거다. 접근하는 순간 그 select 문을 실행하는 가상의 테이블이라고 생각하면 된다.

 

그래서,

create view v_height167 as select * from member where height >= 167;

이렇게 뷰를 생성하고,

insert into v_height167 values('AAA', 165, '2005-01-01');

이런 식으로 값을 넣어도 들어가지만, 저 뷰를 조회하면 저 값은 나오지 않는다.

저 값은 원본 테이블에 들어간다.

 

만약 뷰를 통해 값을 입력할 때 조건을 걸고 싶다면,

alter view v_height167 as select * from member where height >= 167 with check option;

이렇게 테이블 생성할 때 check 옵션 줬던 것 처럼 where와 함께 with check option 하면서 주면 된다.

그럼 뷰를 통한 insert는 저 where의 조건 미충족시 에러 뜬다.

 

그리고, 뷰가 있어도 테이블 자체는 삭제 가능하다.

뷰는 그냥 바로가기라.. 원하는 옵션을 지정해놓는 바로가기?

'DB' 카테고리의 다른 글

스토어드 프로시저2  (0) 2023.11.14
인덱스  (0) 2023.11.10
제약조건  (0) 2023.11.08
동적 SQL  (0) 2023.11.07
스토어드 프로시저  (0) 2023.11.06