1. 뷰란?
- 하나의 가상 테이블
- 작업을 하다 보면 자주 조회하는 테이터들이 있는데 한 테이블에 데이터가 있으면 조회하기 편하겠지만 그렇지 않는 경우가 있음
- 이런 경우 여러 테이블을 join 사용하여 가져오고 쿼리가 복잡한 경우도 있음
- 이런 경우 쿼리로 뷰를 만들어 놓고 사용하면 편리
- 뷰는 보안에도 유리, 테이블에 데이터를 노출시키고 싶지 않을 때, 뷰를 사용하여 보여줄 데이터만 뷰로 제공할 수 있음 (ex. 다른 업체에 DB 데이터 조회 권한을 주었을 때, 테이블의 특정 데이터 노출 안함)
2. 뷰의 특징
- view는 table과 유사하며, 테이블처럼 사용 가능
- 테이블과는 달리 데이터를 저장하기 위한 물리적인 공간이 필요하지 않은 가상 테이블
- 데이터를 물지적으로 갖지 않지만 논리적인 집합을 갖는다.
- 테이블과 마찬가지로 select, insert, update, delete 명령이 가능
코드
-- job_id가 ST_CLERK인 사원들의 사번, 이름, 직업, 고용일, 부서 아이디를 뷰로 생성
-- 뷰 생성
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 e
WHERE job_id = 'ST_CLERK'
;
SELECT * FROM V_EMP ve ;
-- 뷰 삭제
DROP VIEW V_EMP ;
-- job_id가 SH_CLERK인 사원들의 emp_id, first_name, job_id, hiredate, dept_id, commission_pct를 가진 view 생성
-- 단, commition_pct가 null일 경우 0으로 출력되는 view 생성
CREATE OR REPLACE VIEW v_emp(emp_id, first_name, job_id, hiredate, dept_id, commition_pct)
AS
SELECT employee_id, first_name, job_id, hire_date, department_id, NVL(commission_pct, 0)
FROM EMPLOYEES e
WHERE job_id = 'SH_CLERK'
;
SELECT * FROM EMPLOYEES e ;
SELECT * FROM v_emp;
-- 180번 사원의 이름이 현재 Winston이다 이름을 kim으로 수정
UPDATE V_EMP SET FIRST_NAME = 'Winston'
WHERE EMP_ID = 180
;
-- 180번 사원의 commission_pct를 0.5로 수정
-- 안되는 이유 : 함수로 작성된 부분은 수정 불가
UPDATE V_EMP SET COMMITION_PCT = 0.5
WHERE EMP_ID = 180;
SELECT *
FROM EMPLOYEES e
WHERE EMPLOYEE_ID = 180
;
-- emp_id, laet_name, annual_sal, emplyee_id, last_name, (salary+salary*nvl(commission_pct,0))*12
-- read 보조
CREATE OR REPLACE VIEW v_emp_sal(emp_id, last_name, annual_sal)
AS
SELECT employee_id, last_name, (salary + salary*nvl(commission_pct, 0))*12
FROM EMPLOYEES e
WITH READ ONLY
;
SELECT * FROM v_emp_sal;
-- 100번 사원의 last_name을 king -> kim으로 수정
UPDATE V_EMP_SAL SET last_name = 'Kim'
WHERE emp_id = 100;
-- 1, salary가 3000 이상이고, 부서가 30번이고, job_id가 'ST_CLERK'인 사용자의
-- emp_id, last_name, dept_id, hire_date 출력
CREATE OR REPLACE VIEW v_sample(emp_id, last_name, dept_id, hire_date)
AS
SELECT EMPLOYEE_ID, LAST_NAME , DEPARTMENT_ID, HIRE_DATE
FROM EMPLOYEES e
WHERE SALARY >= 3000
AND DEPARTMENT_ID = 50
AND JOB_ID = 'ST_CLERK'
;
SELECT * FROM v_sample;
SELECT * FROM EMPLOYEES e WHERE EMPLOYEE_ID = 132;
-- 2. emp_id, name(TJ Olson), dept_id, hire date
-- 단, 50번 부서의 사원
CREATE OR REPLACE VIEW v_sample2(emp_id, name, dept_id, hire_date)
AS
SELECT EMPLOYEE_ID , FIRST_NAME || ' ' || LAST_NAME, DEPARTMENT_ID , HIRE_DATE
FROM EMPLOYEES e
WHERE DEPARTMENT_ID = 50
;
SELECT * FROM v_sample2;
-- 3. emp_id, first_name, dept_id, dept_name
CREATE OR REPLACE VIEW v_sample3(emp_id, first_name, dept_id, dept_name )
AS
SELECT e.EMPLOYEE_ID , e.FIRST_NAME, e.DEPARTMENT_ID , d.DEPARTMENT_NAME
FROM EMPLOYEES e
LEFT OUTER JOIN DEPARTMENTS d
ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
;
SELECT * FROM v_sample3;