본문 바로가기
DB

[SQL] VIEW – 인라인 뷰, 스토어드 뷰, VIEW 옵션

by chan10 2021. 3. 22.

인라인 뷰(INLINE-VIEW)

o  일반적으로 FROM절에 사용된 서브쿼리의 결과에 별칭을 붙인 것을 말함

o  FROM절에 서브쿼리를 작성하며 서브 쿼리의 결과를 테이블로 사용하는 것이다.

o  FROM절에 서브쿼리를 직접 사용해도 되고 따로 뷰를 생성 후 FROM절에 생성한 뷰를 사용해도 됨

o  테이블은 실제 물리적 테이블에 있는 값이 아닌 가상의 테이블 값이다.

-> 실제 테이블에서 추출한 가상의 테이블(실제 DB에 저장되어 있지 않은 테이블)

o  1번만 사용할 수 있는 테이블로 쓰이는 서브 쿼리 문 -> 자바의 익명 클래스와 같은 개념

SELECT ROWNUM, EMP_NAME, SALARY

FROM EMPLOYEE

WHERE ROWNUM <= 5

ORDER BY SALARY DESC;

 

 

* ROWNUM FROM절을 수행하면서 붙여지기 때문에 top-N분석 시 SELECT절에 사용한 ROWNUM이 의미 없게 됨

SELECT ROWNUM, EMP_NAME, SALARY

FROM (SELECT *

FROM EMPLOYEE

ORDER BY SALARY DESC)

WHERE ROWNUM <= 5;

 

* FROM절에 이미 정렬된 서브쿼리(인라인 뷰) 적용 시 ROWNUM top-N분석에 사용 가능

여사원의 사번, 사원명, 부서코드, 성별 출력하기

SELECT *

FROM

    (SELECT EMP_ID, EMP_NAME, DEPT_CODE,

        DECODE(SUBSTR(EMP_NO,8,1),'1','','2','') AS 성별

        FROM EMPLOYEE)

WHERE 성별='';

 --FROM절 먼저 실행 후 WHERE절이 실행되기에 별칭을 사용할 수 있다.

SELECT *

FROM

    (SELECT EMP_NAME, DEPT_TITLE, JOB_NAME, SALARY,

        FLOOR((SELECT AVG(SALARY) FROM EMPLOYEE WHERE E.JOB_CODE=JOB_CODE)) AS JOBAVG

        FROM EMPLOYEE E

         JOIN DEPARTMENT D ON E.DEPT_CODE=DEPT_ID

         JOIN JOB J ON E.JOB_CODE=J.JOB_CODE

        WHERE DEPT_CODE IN ('D5','D6')

        ORDER BY 1

    );

  

스토어드 뷰(STORED VIEW)

o  테이블로 쓰이는 서브 쿼리문을 작성하고 이름을 부여해서 재호출을 가능하게 하는 것이다.

  

VIEW 옵션

1.      OR REPLACE

VIEW 생성 시 이미 이름이 존재하는 경우 덮어쓰기를 수행한다.

SELECT * FROM USER_VIEWS;

CREATE OR REPLACE VIEW V_EMP

AS SELECT * FROM EMPLOYEE JOIN DEPARTMENT ON DEPT_CODE=DEPT_ID;

 

2.      FORCE/NOFORCE

FORCE옵션은 기본 테이블이 존재하지 않더라도 뷰를 생성할 수 있게 해주는 옵션

NOFORCE 옵션이 기본 값으로 지정되어 있음

CREATE FORCE VIEW V_TEMP
AS SELECT * FROM TT;

SELECT * FROM V_TEMP; -- 없는 테이블을 기반으로 생성했기에 조회할 수 없다.

 

CREATE TABLE TT(

    IDX NUMBER,

    NAME VARCHAR2(20)

);

 

SELECT * FROM V_TEMP;

-- 나중에 생성한 테이블의 항목을 따라간다.

 

3.      WITH CHECK OPTION

SELECT문의 WHERE 절에 사용한 컬럼은 수정이 불가능하게 하는 옵션

CREATE OR REPLACE VIEW V_EMP_SAL

AS SELECT EMP_NAME, DEPT_CODE, SALARY, SALARY*12 AS 연봉

FROM EMPLOYEE WHERE DEPT_CODE='D5' WITH CHECK OPTION;

 

UPDATE V_EMP_SAL SET DEPT_CODE='D6' WHERE EMP_NAME='대북혼';

-- DEPT_CODE 변경시도 시 에러가 발생한다.

 

4.      WITH READ ONLY

VIEW에 대해 조회만 가능하고 삽입, 수정, 삭제 등은 불가능하게 함

CREATE OR REPLACE VIEW V_READ
AS SELECT EMP_NAME, DEPT_CODE, JOB_CODE, SALARY
FROM EMPLOYEE WHERE DEPT_CODE='D5' WITH READ ONLY;
UPDATE V_READ SET SALARY=10000; -- 수정 불가하다는 에러 발생