🪞 Views

  • 하나 이상의 테이블로부터 유도된 이름을 가진 가상 테이블
CREATE [OR REPLACE] VIEW view_name
[col1, col2, ...]       -- 컬럼명 변경 시 정의
AS
SELECT statement;       


  • ex) 학생 테이블의 컴퓨터학과 학생들로 뷰 생성
    CREATE OR REPLACE VIEW CSTUDENT (S_ID, S_NAME, S_YEAR)
    AS
    SELECT S_ID, S_NAME, S_YEAR
    FROM STUDENT
    WHERE S_MAJOR = '컴퓨터학과';
    


  • ex)
    CREATE OR REPLACE VIEW MAJOR_SIZE
    AS
    SELECT S_MAJOR, COUNT(*) AS ST_NUM
    FROM STUDENT
    GROUP BY S_MAJOR;
    


  • ex) 두 개 이상 테이블 연관하여 정의
    CREATE OR REPLACE VIEW ENROLL_2004 (S_ID, S_NAME, C_ID)
    AS
    SELECT S.S_ID, S.S_NAME, E.C_ID
    FROM STUDENT S, ENROLL E
    WHERE S.S_ID = E.S_ID 
    AND E_YEAR = '2004';
    


🪞 뷰 구조 및 이름 확인

  • USER_VIEWS 데이터 사전 테이블
    select view_name, text_length, text 
    from USER_VIEWS;
    

    스크린샷 2023-04-06 오후 8 50 20


🪞 뷰 수정

  • OR REPLACE 옵션
    • CREATE 절에 추가
    • 테이블이 없으면 만들고, 존재하면 현재 쿼리로 대체
CREATE OR REPLACE VIEW CSTUDENT (S_ID, S_NAME, S_YEAR, S_ADDR)
AS
SELECT S_ID, S_NAME, S_YEAR, S_ADDR
FROM STUDENT
WHERE S_MAJOR = '컴퓨터학과';


🪞 뷰를 통한 데이터 변경

  • 뷰가 하나의 테이블을 사용하고, 적절한 권한이 있다면 INSERT, UPDATE, DELETE문을 이용해 뷰가 참조하는 테이블의 데이터 변경 가능
  • READ ONLY 옵션 사용
    • 뷰에서 삽입, 갱신, 삭제 불가능!


  • ex1)
    UPDATE CSTUDENT
    SET S_YEAR = 3
    WHERE S_ID = '20011234';
    

    -> VIEW 수정 + TABLE까지 수정됨!


WITH CHECK OPTION

  • 뷰를 생성할 때 WITH CHECK OPTION 옵션을 추가하면, 뷰를 수정할 때 뷰의 제약조건에 맞지 않으면 에러 발생
  • ex) Book 테이블에서 출판사에 ‘미디어’가 들어가는 데이터만 모은 뷰 book_view에
    • WITH CHECK OPTION 추가 X -> 뷰에 ‘미디어’가 들어가지 않는 데이터를 추가해도 원래 테이블 Book에 데이터 추가 됨!
    • WITH CHECK OPTION 추가 O -> 뷰에 ‘미디어’가 들어가지 않는 데이터를 추가하면, 뷰의 제약조건에 맞지 않기 때문에 에러 발생, 데이터 추가되지 않음!


🪞 뷰 삭제

  • 뷰는 기본 테이블을 기반으로 하기 때문에 데이터 손실 없이 뷰 삭제 가능
    DROP VIEW view_name;