VIEW

MINIMI·2023년 1월 17일
0

ORACLE

목록 보기
9/11
post-thumbnail

1) 정의

  • SELCET된 가상의 테이블(물리적 공간에 존재 X)
  • SELECT 쿼리문을 저장한 객체로 실질적인 데이터를 저장하고 있지 않은 논리적인 테이블이나 테이블을 사용하는 것과 동일하게 사용할 수 있다

2) 장점

  • 복잡한 SELECT 문을 다시 작성할 필요 없음
  • 민감한 데이터를 숨길 수 있다
    • 접근 권한을 세분화 해서 접근 가능
    • 테이블에서 사용해야만하는 데이터를 모아 VIEW를 만들고, VIEW에는 접근 가능하지만 TABLE에는 접근 불가 설정

3) 표현식

  • CREATE OR REPLACE VIEW 뷰이름 AS 서브쿼리;
-- 사번, 이름, 직급명, 부서명, 근무지역을 조회하고 그 결과를 V_RESULT_EMP라는 뷰로 생성
CREATE OR REPLACE VIEW V_RESULT_EMP
AS
SELECT
       EMP_ID
     , EMP_NAME
     , JOB_NAME
     , DEPT_TITLE
     , LOCAL_NAME
  FROM EMPLOYEE E
  LEFT JOIN JOB J ON(E.JOB_CODE = J.JOB_CODE)
  LEFT JOIN DEPARTMENT D ON (E.DEPT_CODE = D.DEPT_ID)
  LEFT JOIN LOCATION L ON (D.LOCATION_ID = L.LOCAL_CODE);

4) 데이터 딕셔너리(DATA DICTIONARY)

  • 자원을 효율적으로 관리하기 위해 다양한 정보를 저장하는 시스템 테이블
  • 사용자가 테이블을 생성하거나, 사용자를 변경하는 등의 작업을 할 때 데이터베이스 서버에 의해 자동으로 갱신되는 테이블
  • 사용자는 데이터 딕셔너리 내용을 직접 수정하거나 삭제할 수 없다.
  • 원본 테이블을 커스터마이징 해서 보여주는 원본 테이블의 가상 테이블(VIEW)
  • EX) USER_CONSTRAINTS, USER_CONS_COLUMNS

5) 특징

  • 뷰에 별칭을 부여해서 생성 가능
CREATE OR REPLACE VIEW V_EMP
(
  사번
, 이름
, 부서
)
AS
SELECT
       EMP_ID
     , EMP_NAME
     , DEPT_CODE
  FROM EMPLOYEE;
  • 베이스 테이블에서 정보가 변경 되면 VIEW도 함께 변경된다.
  • VIEW의 컬럼명은 함수식이 될 수 없으므로 별칭 설정 필수
CREATE OR REPLACE VIEW V_EMP_JOB
( 
  사번
, 이름
, 직급
, 성별
, 근무년수
)
AS
SELECT
       EMP_ID
     , EMP_NAME
     , JOB_NAME
     , DECODE(SUBSTR(EMP_NO,8,1), '1', '남', '여')
     , EXTRACT(YEAR FROM SYSDATE) - EXTRACT(YEAR FROM HIRE_DATE) 
  FROM EMPLOYEE
  JOIN JOB USING (JOB_CODE);

6) DML 명령어로 VIEW 조작이 불가능 한 경우

  • 뷰 정의에 포함되지 않은 컬럼을 조작하는 경우
    CREATE OR REPLACE VIEW V_JOB2
    AS
    SELECT J.JOB_CODE
    FROM JOB J;
  • 뷰에 포함되지 않은 컬럼 중에 베이스가 되는 테이블 컬럼이 NOT NULL 제약조건이 지정된 경우
    -- JOB_CODE에는 NULL이 삽입 될 수 없어 오류
    INSERT
    INTO V_JOB3
    (
      JOB_NAME
    )
    VALUES
    (
      '인턴'
    );  
  • 산술 표현식으로 정의된 경우
  • JOIN을 이용해 여러 테이블을 연결한 경우
    • 베이스가 된 테이블이 아닐 경우 INSERT 불가
      INSERT
      INTO V_JOINEMP
      (
          EMP_ID
        , EMP_NAME
        , DEPT_TITLE
      )
      VALUES 
      (
        888
      , '조세오'
      , '인사관리부'
      );
  • DISTINCT를 포함한 경우
  • 그룹함수나 GROUP BY 절을 포함한 경우
CREATE OR REPLACE VIEW V_GROUPDEPT
AS
SELECT E.DEPT_CODE
     , SUM(E.SALARY) 합계
     , AVG(E.SALARY) 평균
  FROM EMPLOYEE E
 GROUP BY E.DEPT_CODE;
 
 -- GROUPING 해 놓은 형태이기 때문에 업데이트 불가
UPDATE
       V_GROUPDEPT V
   SET V.DEPT_CODE = 'D10'
 WHERE V.DEPT_CODE = 'D1';

7) VIEW 옵션

  • OR REPLACE : 기존에 동일한 뷰 이름이 존재하는 경우 덮어쓰고 존재하지 않으면 새로 생성

  • FORCE : 서브 쿼리에 사용 된 테이블이 존재하지 않아도 뷰 생성

  • NOFORCE : 서브 쿼리에 테이블이 존재해야만 뷰 생성(기본값)

  • WITH CHECK OPTION

    • 조건절에 사용 된 컬럼의 값을 수정하지 못하게 하는 옵션
    CREATE OR REPLACE VIEW V_EMP2
    AS
    SELECT
         E.*
    FROM EMPLOYEE E
    WHERE MANAGER_ID = '200'
    WITH CHECK OPTION;
    
    -- 뷰의 WITH CHECK OPTION의 조건에 위배 됩니다
    UPDATE
         V_EMP2
     SET MANAGER_ID = '900'
     WHERE MANAGER_ID = '200';
  • WITH READ ONLY

    • DML 수행이 불가능하게 하는 옵션
profile
DREAM STARTER

0개의 댓글