/* view(뷰)
가상 테이블
  데이터를 물리적으로 갖지 않지만 논리적인 집합을 가짐
  테이블과 마찬가지로 select, insert, update, delete 명령이 가능
*/

/*
view의 활용
보안 관리를 위한 뷰
  보안등급에 맞추어 컬럼 및 범위 정하여 조회 가능
  연산 결과만 제공하고 알고리즘을 숨기기 위해 사용
  select list를 함수로 가공하여 update, insert를 못하도록 함
  테이블 명이나 컬럼 명을 숨기도록 함
  
사용편의성을 위한 뷰
  검색조건을 단순화하여 사용할 수 있도록 함(복접한걸 미리 만들어놓고 사용)
  조인을 단순화(미리 조인해서 만든 가상 테이블을 이용)
  사용자를 위한 컬럼명이나 테이블명 제공
*/

-- view 생성
create view v_emp(emp_id, first_name, job_id, hiredate, dept_id) -- 생성할 뷰의 컬럼명
as select employee_id, first_name, job_id, hire_date, department_id -- 실제 컬럼들
  from employees
  where job_id = 'ST_CLERK';
  

-- 없으면 생성하고 있으면 대체
create or replace view v_emp(emp_id, first_name, job_id, hiredate, dept_id) -- 생성할 뷰의 컬럼명
as select employee_id, first_name, job_id, hire_date, department_id -- 실제 컬럼들
  from employees
  where job_id = 'ST_CLERK';
  

-- 특정 컬럼을 함수로 넣어서 수정을 할 수 없도록!
create or replace view v_emp3(emp_id, first_name, job_id, hiredate, dept_id)
as select employee_id, nvl(first_name, null), job_id, hire_date, department_id
  from employees
  where job_id = 'SH_CLERK';
  
-- nvl 설정때문에 오류
update v_emp3
set first_name = 'Kim'
where first_name = 'Julia';

-- commission_pct가 null이면 0으로 처리
-- annual_sal을 구하는 연산을 숨기고 결과만 보여주는 것
create view v_emp_salary(emp_id, last_name, annual_sal) as
select employee_id, last_name, (salary+nvl(commission_pct, 0)*12)
from employees;

-- 역시 함수로 연산하여 나온 컬럼이기 때문에 수정 불가
update v_emp_salary
set annual_sal = 8000
where last_name = 'Hunold';


-- 뷰의 데이터 수정 다 막는 것
create view v_emp_readonly(emp_id, last_name, annual_sal) as
select employee_id, last_name, (salary+nvl(commission_pct, 0)*12)
from employees
with read only;

-- read only 옵션 때문에 수정 불가
update v_emp_readonly set last_name = 'Kim'
where last_name='Grant';


-- 복잡한 쿼리를 뷰로 만들어서 간단히 조회
create or replace view v_samp1 as
select employee_id, last_name, department_id, hire_date
from employees
where (salary + nvl(commission_pct, 0))*12 > 40000
  and department_id = 50
  and job_id = 'ST_CLERK'
  and sysdate - 365*5 > hire_date;
  
select * from v_samp1;


-- 사용자의 편의성을 위한 테이블명 제공
create view 사원 (사번, 이름, 부서번호, 입사일) as
select employee_id, first_name||' '||last_name, department_id, hire_date
from employees
where department_id=50;

select * from 사원;


-- join이 필요한 테이블을 단순화하여 조회
create view v_join(사번, 이름, 부서번호, 부서명, 입사일) as
select emp.employee_id, emp.first_name||' '||emp.last_name, emp.department_id, dept.department_name, emp.hire_date
from employees emp, departments dept
where emp.department_id = dept.department_id;

select * from v_join;

'Oracle' 카테고리의 다른 글

계층형 쿼리  (0) 2017.09.13
시퀀스 사용하기  (0) 2017.09.13
무결성 제약조건  (0) 2017.09.11
insert, update, delete, commit, rollback 문(DML)  (0) 2017.09.07
create, alter, drop, truncate 문을 이용한 테이블 관리(DDL)  (0) 2017.09.07

+ Recent posts