Database-view

 

View

virtual table view

--VIEW는 가상 테이블이다, 객체이다, create를 사용하여 생성해야한다.
--create view '뷰이름' as 'view가 보는 목록'(select구문)
--view는 테이블 처럼 사용가능하다(가상 테이블이기 때문에) -> 실제하는 물리적인 table이 아니다.
--view는 메모리상에만 존재하는 가상 테이블이다. (subquery -> in line view -> from(query문))
--view는 sql문장 덩어리이다. 물리적인 테이블 처럼 사용하는 것이다.
--사용법 : 일반 테이블과 사용법이 동일하다. from , where 
--DML이 가능하다. (insert , update, delete) -> view를 통해서만 가능하다. -> 실제 view를 통해 볼 수 있는 실테이블 데이터 변경
--view 사용하는 이유 >> 개발자의 편리성 >> 복잡한 query ( join, subquery) 에 쉽게 접근 사용하기 위해서 >> 단순화할 수 있다.
--                            >>  보안적인 이유 (권한 별로 처리 ) -> 노출하고 싶은 data만 모아서 view를 만들어서 사용자에게 제공한다.

create view v_001 
as select empno,ename from emp;

select * from v_001;
select* from v_001 where empno = 7788;

create view v_002
as 
  select e.empno,e.ename,e.sal,e.deptno,d.dname 
  from emp e join dept d 
  on e.deptno = d.deptno; --복잡한 query를 단순화 한다.

select * from v_002;

create view v_003
as
  select deptno, avg(sal) as "avgsal"
  from emp
  group by deptno;

select *
from emp e join v_003 s
on e.DEPTNO = s.DEPTNO
where e.sal > s."avgsal";

--원하는 데이터가 table로 존재한다면 이라는 생각이 들면 view를 사용하자!!!!!!!!!!!!!!!!!!!
-- in line view , view 사용하면 된다.

-- 1. view 변경하기 create or replace v_007 as 구문 (수정,overwrite)
/*
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 이 수행될 수 없게 한다. 
*/
-- 2. view는 column명이 필요하다.
create or replace view v_emp
as
  select empno,ename,deptno from emp where deptno=20;

SELECT * from v_emp;
SELECT * from v_emp where deptno = 10; -- error >>v_emp는 deprno가  20번인 것만 있으므로
--view >> DML(insert, update, delete)
-- view를 통한 데이터에 대해서 DML가능하다. -->> view가 바뀌는 것이 아니라 view가 보는데이터가 바뀐다.
--단일 테이블만 >> view를 통해서
select * from v_emp;
select* from dept;

delete from v_emp; -->> deptno 20인 자료가 emp에서 삭제 된다. view가 보는 데이터만 가능하다. commit , rollback이 가능하다.

Example Quiz

--1. 30번 부서 사원들의 직위, 이름, 월급을 담는 VIEW를 만들어라.
create view view001
as
  select job,ename,sal
  from emp 
  where deptno = 30;

select * from view001;
--2. 30번 부서 사원들의  직위, 이름, 월급을 담는 VIEW를 만드는데,
-- 각각의 컬럼명을 직위, 사원이름, 월급으로 ALIAS를 주고 월급이
-- 300보다 많은 사원들만 추출하도록 하라.
-- create or replace view view001 (컬럼명, 컬럼명, .....)  
create view view002(직위,사원이름,월급)
as
  select job,ename,sal 
  from emp
  where deptno = 30 and sal>300;


select * from view002;
 
--3. 부서별 최대월급, 최소월급, 평균월급을 담는 VIEW를 만들어라.
create view view003("최대월급","최소월급","평균월급")
as
  select max(sal),min(sal),avg(sal)
  from emp
  group by deptno;
 
select * from view003;      
--4. 부서별 평균월급을 담는 VIEW를 만들되, 평균월급이 2000 이상인
-- 부서만 출력하도록 하라.
create view view004
as
  select avg(sal) as "평균월급"
  from emp
  group by DEPTNO 
  having avg(sal) >= 2000;

select * from view004;      
 

 
--5. 직위별 총월급을 담는 VIEW를 만들되, 직위가 MANAGER인
-- 사원들은 제외하고 총월급이 3000이상인 직위만 출력하도록 하라.
create or replace view view005
as
  select job,SUM(SAL) as "총월급"
  from emp
  where job != 'MANAGER'
  group by job
  having sum(sal) >=3000;
  
  select * from view005;