[Oracle] 오라클 #17, 뷰(view) 예제 및 응용

뷰, View

- DB Object 중 하나(테이블, 시퀀스, 뷰)

- 가상 테이블

- 진짜 테이블의 복사본 -> 복사 테이블, 뷰 테이블, 가상 테이블..

- 테이블처럼 취급하는 객체(***)

뷰 관리

1. create

2. drop


뷰생성

create view vwInsa --머리

as                         --목

select * from tblInsa; --몸통(*****)


복사 테이블 생성

create table copyInsa

as

select * from tblInsa;


뷰사용


from 절에서 일반 테이블과 똑같이 쓸 수 있다

select * from vwInsa;

select * from copyInsa; 


이렇게 where 절로 조건도 달아서 원하는 데이터도 뽑아낼 수 있다.

select * from vwInsa where buseo = '기획부'; 

select * from copyInsa where buseo = '기획부'; 



뷰의 특징


1. 자주 반복하는 쿼리를 간단하게 줄일 수 있다.


2. 복사

 a. 복사 테이블 : 원본 테이블의 깊은 복사. 완전 복사본 만들어서 분리시킨다. 원본 테이블 수정 > 복사 테이블 반영 X

 b. 뷰 : 원본 테이블의 얕은 복사. 뷰는 데이터 저장 객체가 아닌 SQL 저장 객체. 원본 테이블 수정 > 뷰 반영 O


3. 뷰는 주로 원본 테이블과는 독립적으로 업무에 필요한 임시 테이블이 필요할 때 만들어서 사용한다.


4. 사용 형태

 a. 자주 반복되는 질의를 저장

 b. 반복과 상관없이 해당 질의에 의미를 부여해서 가독성을 높이고 싶을 때

 c. 보안 : 권한 중 하나 > 자원(테이블,뷰)에 대한 접근 권한


(이런 전체 직원데이터가 있을때)

select * from tblInsa;


(나는 기획부만 보고싶어)

select * from tblInsa where buseo = '기획부';


그걸 뷰로 이렇게 만들어서

create view 기획부

as

select * from tblInsa where buseo = '기획부';


필요할때 기획부만 조회하면 된다!!

select * from 기획부;




전체 직원 목록

select * from tblInsa;


부장 목록

select * from tblInsa where jikwi = '부장';


부장뷰 생성

create view vw부장

as

select * from tblInsa where jikwi = '부장';


부장들만 쏙

select * from vw부장;



뷰 수정


- DB Object 수정하는 명령어 > alter

- 뷰는 다른방법을 사용 or replace

- 즉 뷰를 만들때 create or replace는 뷰를 생성하거나 대체한다(변경한다) 라는 의미로 생성하던 대체하던 내가지금 컴파일하는 뷰를 이 이름의 뷰로 만들겠다는 의미.


당신이 컴파일을 하는 지금 이 쿼리는 vwComplete이라는 뷰를 만들건데 이건 create이던지 replace던지 나는 앞으로 이 뷰를 vwComplete에 담아서 호출할거야. 라는 뜻

create or replace view vwComplete

as

select title, completedate from tblTodo where completeDate is not null;


뷰삭제

drop view vwComplete;


****뷰는 읽기전용이다. 뷰는 읽기전용으로만 사용해야 한다.


select * from tblTodo;


--할일 추가하기

insert into tblTodo(seq, title, adddate,completedate) values (21,'오라클공부하기',sysdate,null);


create or replace view vwTodo

as

select title,completedate from tblTodo;


--읽기

select * from vwTodo;

--쓰기

insert into vwTodo(seq, title, adddate,completedate) values (22,'오라클공부하기',sysdate,null); --ORA-00904: "ADDDATE": invalid identifier

insert into vwTodo(title, completedate) values ('뷰공부하기',null);                             --ORA-01400: cannot insert NULL into ("HR"."TBLTODO"."SEQ")

--수정하기

update vwTodo set title = 'view 공부하기' where seq=21;

--삭제하기

delete from vwTodo where seq=22;




--뷰 사용시 DML 적용할일이 생긴다면?? -> 테이블을 사용한다.

--뷰는 읽기전용으로만 사용한다.


댓글

Designed by JB FACTORY