단순 뷰 : 하나의 테이블과 연관된 뷰
복합 뷰 : 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의 조건 미충족시 에러 뜬다.
그리고, 뷰가 있어도 테이블 자체는 삭제 가능하다.
뷰는 그냥 바로가기라.. 원하는 옵션을 지정해놓는 바로가기?