뷰(View)
뷰(View)는 하나 이상의 테이블이나 다른 뷰의 데이터를 볼 수 있게 하는 데이터베이스 객체입니다.
실제 데이터는 뷰를 구성하는 테이블에 담겨 있지만 마치 테이블처럼 사용할 수 있습니다.
또한 테이블 뿐만 아니라 다른 뷰를 참조해 새로운 뷰를 만들어 사용할 수 있습니다.
뷰는 실제로 데이터를 저장하고 있지는 않지만 DML 작업이 가능한 가상의 테이블이라고 생각하면 된다.
뷰(View)의 사용 목적
여러개의 테이블에서 필요한 정보를 뽑아 사용할때가 많습니다.
이때 좀 더 편리하게 사용할 수 있는 방법중의 하나가 바로 뷰입니다.
뷰를 사용하면 복잡한 질의를 쉽게 만들어 줍니다.
여러테이블의 JOIN과 GROUP BY 같은 같은 복잡한 쿼리를 view로 저장시켜놓으면
다음부터는 저장한 view의 정보만 가져오면 되므로 쉽게 좀 더 편리하게 사용할 수 있습니다.
일종의 함수라고도 생각하셔도 될듯 합니다.
또한 뷰는 데이터 보안에서도 유리한데요.
뷰를 보면 컬럼과 데이터만 공개되므로 원천 테이블은 알 수 없습니다.
사용방법
CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW view_name [(alias[,alias,...])]
AS Subquery
[WITH CHECK OPTION [CONSTRAINT constraint ]]
[WITH READ ONLY]
OR REPLACE 이미 존재한다면 다시 생성한다.
FORCE Base Table 유무에 관계없이 VIEW을 만든다
NOFORCE 기본 테이블이 존재할 경우에만 VIEW를 생성한다.
view_name VIEW 의 이름
Alias Subquery 를 통해 선택된 값에 대한 Column명이 된다.
Subquery SELECT 문장을 기술한다.
WITH CHECK OPTION VIEW 에 의해 액세스 될 수 있는 행만이 입력,갱신될 수 있다.
Constraint CHECK OPTON 제약 조건에 대해 지정된 이름이다.
WITH READ ONLY 이VIEW 에서 DML이 수행될 수 없게 한다.
예시
create view view001
as
select * from emp;
create view vvv
as
select e.*,d.DEPTNO as "d.DEPTNO", DNAME, LOC
from emp e
join DEPT d on e.DEPTNO = d.DEPTNO
where e.DEPTNO != 10
order by e.EMPNO;
join을 하는 등 복잡한 뷰를 생성가능.
create view v_003
as
select deptno, trunc(avg(sal)) as avgsal
from EMP
group by deptno;
create or replace view vvv
as select * from dept
OR REPLACE 이미 존재한다면 다시 생성한다. [위에 이미 만들었던 vvv가 재생성된다.]
OR REPLACE를 이용해서 뷰의 수정을 할 수있다. [ 수정 == 재생성]
삭제는 drop view 뷰이름으로 삭제가능하다.
select *
from emp e join v_003 s
on e.DEPTNO = s.deptno
where e.sal > s.avgsal;
당연히 뷰와 조인가능
DML
뷰는 DML을 사용하는것을 권장하지않지만
create view view001
as
select * from emp;
뷰가 다음과 같이 하나의 테이블로 만들어진 것이라면 ( 다른 테이블과 join하지않았다면 )
뷰를 수정하는것은 기준 테이블(view001을 만들기위해 사용된 emp테이블)이 수정되는것이다.
뷰는 실제 데이터를 저장하고있지않기 때문에 기준 테이블이 수정된다.
update view001
set ename = 'hi'
where sal < 3000;
뷰는 select를 할때만 사용하고 데이터의 수정이 필요하면 원본(기준)테이블에 직접가서 수정을 한다.
'데이터베이스 > Oracle' 카테고리의 다른 글
트리거 Trigger (0) | 2024.04.09 |
---|---|
Sequence 시퀀스 (0) | 2024.04.04 |
가상컬럼 (0) | 2024.04.03 |
oracle 테이블 복사 및 구조 복사 , PL-SQL(반복문) (0) | 2024.04.03 |
서브쿼리 (subQuery) [스칼라,인라인 뷰,중첩] // all any some 연산자 (0) | 2024.04.02 |
댓글