- 하나의 가상 테이블
- 작업을 하다보면 자주 조회하는 데이터들이 있다. 또 한 테이블에 데이터가 있으면 조회하기 편하겠지만 그렇지 않은 경우가 있다. 여러 테이블들을 JOIN해서 가져오고 쿼리가 복잡한 경우도 있다. 이러한 경우 쿼리로 뷰를 만들어 놓고 사용하면 편리하다.
- 뷰는 보안에 유리하다.
- 테이블에 데이터를 노출시키고 싶지 않을 때, 뷰를 사용하여 보여줄 데이터만 뷰로 제공할 수 있다.
1. 뷰의 특징
- 원천 데이터가 변경되면 view 데이터도 자동 변경
- 뷰의 검색은 자유로우나, 삽입, 수정, 삭제는 제약이 있다.
- 뷰 생성 쿼리에 함수를 사용하면 반드시 alias를 지정
- view는 table과 유사하며, table처럼 사용한다.
- table과는 달리 데이터를 저장하기 위한 물리적인 공간이 필요하지 않은 가상 테이블이다.
- 데이터를 물리적으로 갖지 않지만, 논리적인 집합을 갖는다.
- table과 마찬가지로 select, insert, update, delete명령이 가능하다.
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;
DROP VIEW V_EMP ;
CREATE OR REPLACE VIEW v_emp(emp_id, first_name, job_id, hiredate, dept_id)
AS
SELECT NVL(EMPLOYEE_ID, ''), NVL(FIRST_NAME, '') , JOB_ID , HIRE_DATE , DEPARTMENT_ID
FROM EMPLOYEES e
;
SELECT * FROM v_emp;
UPDATE V_EMP SET FIRST_NAME = 'kim'
WHERE FIRST_NAME = 'Lex';
CREATE OR REPLACE VIEW v_emp2(emp_id, first_name, job_id, hiredate, dept_id)
AS
SELECT NVL(EMPLOYEE_ID, ''), FIRST_NAME, JOB_ID , HIRE_DATE , DEPARTMENT_ID
FROM EMPLOYEES e
;
SELECT * FROM v_emp2;
UPDATE V_EMP2 SET FIRST_NAME = 'kim'
WHERE FIRST_NAME = 'Lex';
SELECT * FROM EMPLOYEES e WHERE EMPLOYEE_ID = 102;
SELECT * FROM EMPLOYEES e
WHERE EMPLOYEE_ID = 102;
CREATE OR REPLACE VIEW v_emp_salary(emp_id, last_name, salary, annual_sal)
AS
SELECT EMPLOYEE_ID , LAST_NAME , SALARY
, (SALARY + (SALARY * nvl(COMMISSION_PCT, 0))) * 12
FROM EMPLOYEES e
;
SELECT * FROM V_EMP_SALARY ves ;
CREATE OR REPLACE VIEW v_emp_salary2(emp_id, last_name, salary, annual_sal)
AS
SELECT EMPLOYEE_ID , LAST_NAME , SALARY
, (SALARY + (SALARY * nvl(COMMISSION_PCT, 0))) * 12
FROM EMPLOYEES e
WITH READ ONLY
;
SELECT * FROM V_EMP_SALARY2 ves ;
UPDATE V_EMP_SALARY2 SET last_name = 'Kim'
WHERE last_name = 'Austin';
CREATE OR REPLACE VIEW v_samp1(employee_id, last_name, department_id, hire_date)
AS
SELECT EMPLOYEE_ID , LAST_NAME , DEPARTMENT_ID , HIRE_DATE
FROM EMPLOYEES e
WHERE SALARY >= 4000
AND DEPARTMENT_ID = 50
AND JOB_ID = 'ST_MAN'
;
SELECT * FROM V_SAMP1 vs ;
CREATE OR REPLACE VIEW v_samp2(emp_id, name, department_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_SAMP2 vs ;
CREATE OR REPLACE VIEW v_samp3(사번, 이름, 부서번호, 부서명, 입사일)
AS
SELECT e.EMPLOYEE_ID , e.FIRST_NAME || ' ' || e.LAST_NAME , d.DEPARTMENT_ID ,d.DEPARTMENT_NAME, e.HIRE_DATE
FROM EMPLOYEES e
LEFT OUTER JOIN DEPARTMENTS d
ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
;
SELECT * FROM V_SAMP3;