SQL/VIEW

VIEW

jjhim531 2024. 9. 1. 20:52
반응형

 SELECT문(쿼리문)을 저장해둘 수 있는 객체

(자주 사용하는 SELECT문을 저장해두면 너무 긴 SELECT문을 매번 다시 기술할 필요없이 뷰명만을 써서 간략히 사용할 수 있다.)

임시테이블 같은 존재

(실제 데이터가 담겨있는 건 아니다 -> 논리테이블)

 

 1. VIEW 생성방법
    
    [표현식]

* 보통 뷰명은 TB_  // VW_이렇게 시작한다.
 

  CREATE VIEW 뷰명 AS 
       (서브쿼리)

* CREATE OR REPLACE를 사용하면 VIEW가 없을 때는 생성, 이미존재한다면 수정할 수 있다.

CREATE OR REPLACE VIEW 뷰명 AS
    ( 서브쿼리)

 

 * 뷰 컬럼에 별칭 부여

서브쿼리의 SELECT절에 함수식이나 산술연산식이 기술되어있다면 반드시 별칭을 부여해야한다.

CREATE OR REPLACE VIEW vw_emp_job AS
    ( SELECT
        emp_id,
        emp_name,
        job_name,
        decode(substr(emp_no, 8, 1), '1', '남', '2', '여')          AS "성별",
        EXTRACT(YEAR FROM sysdate) - EXTRACT(YEAR FROM hire_date) AS "근무년수"
    FROM
             employee
        JOIN job USING ( job_code )
    );

* 뷰를 삭제하고싶을 떄

DROP VIEW 뷰명;

 

* 생성된 뷰를 통해서 DML(INSERT, UPDATE, DELETE) 사용가능

뷰를 통해서 조작하게되면 실제 데이터가 담겨있는 테이블에 반영이 된다.

EX)

INSERT INTO vw_job VALUES (
    'J8',
    '인턴'
);

EX)

UPDATE vw_job
SET
    job_name = '알바'
WHERE
    job_code = 'J8';

 

* DML 명령어로 조작이 불가능한 경우가 많다

  1.  뷰에 정의되어있지 않은 컬럼을 조작하려고하는 경우
  2. 뷰에 정의되어있지 않은 컬럼 중에 베이스테이블 상에 NOT NULL제약조건이 지정되어있는 경우
  3.  산술연산식이나 함수식을 사용한 경우
  4.  그룹함수나 GROUP BY절을 포함한 경우
  5. DISITINCT구문이 포함된 경우
  6. JOIN을 이용해서 여러테이블을 연결시켜놓은 경우

대부분 뷰는 조회를 목적으로 생성한다. 그냥 뷰를 통한 DML은 안쓰는게 좋다
    

VIEW 옵션
    
    [상세표현식]

 CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW 뷰명
    AS 서브쿼리
    [WITH CHECK OPTION]
    [WITH READ ONLY];


    
    1) OR REPLACE : 기존에 동일한 뷰가 있을 경우 갱신하고, 없을 경우 새로 생성해라
    2) FORCE | NOFORCE
        > FORCE : 서브쿼리에 기술된 테이블이 존재하지 않아도 뷰가 생성되도록해라

CREATE OR REPLACE FORCE VIEW vw_emp AS
    SELECT
        tcode,
        tname,
        tcontent
    FROM
tt;


        > NOFORCE : 서브쿼리에 기술된 테이블이 존재하는 테이블이여야만 한다(기본값)

CREATE OR REPLACE NOFORCE VIEW vw_emp AS
    SELECT
        tcode,
        tname,
        tcontent
    FROM
        tt;


    3) WITH CHECK OPTION : DML시 서브쿼리에 기술된 조건에 부합한 값으로만 DML이 가능하도록. 서브쿼리에 기술된 조건에 부합하지 않는 값으로 수정시 오류 발생

CREATE OR REPLACE VIEW vw_emp AS
    SELECT
        *
    FROM
        employee
    WHERE
        salary >= 3000000
WITH CHECK OPTION;
UPDATE vw_emp
SET
    salary = 2000000
WHERE
    emp_id = 200;


    4) WITH READ ONLY : 뷰에 대해서 조회만 가능하도록

CREATE OR REPLACE VIEW vw_emp AS
    SELECT
        emp_id,
        emp_name,
        bonus
    FROM
        employee
    WHERE
        bonus IS NOT NULL
WITH READ ONLY;
DELETE FROM vw_emp
WHERE
    emp_id = 200;

728x90
반응형