MariaDB | 뷰 VIEW

2025. 2. 4. 10:39기반기술/Database

1. VIEW

  • SELECT 쿼리문을 저장한 객체로 가상테이블이라고 불린다.
  • 실질적인 데이터를 물리적으로 저장하고 있지 않고 쿼리만 저장했지만 테이블을 사용하는 것과 동일하게 사용할 수 있다.
  • 사용 목적
    • 데이터를 쉽게 읽고 이해할 수 있도록 함
    • 원본 데이터의 보안을 유지하는데 도움

 

2. VIEW 생성 (CREATE VIEW)

  • CREATE VIEW 이름 AS (SELECT ... ) ;
  • 베이스 테이블의 정보가 변경되면 VIEW의 결과도 같이 변경된다.
SELECT * FROM tbl_menu;

-- VIEW 생성
CREATE VIEW hansik AS
SELECT 
       menu_code 
     , menu_name
     , menu_price
     , category_code
     , orderable_status
  FROM tbl_menu 
 WHERE category_code = 4;

-- 생성된 VIEW 조회
SELECT * FROM hansik;

 

 

3. VIEW를 통한 DML (INSERT, UPDATE, DELETE)

  • VIEW를 통한 DML 작업은 베이스 테이블에도 영향을 주게 된다.
  • 사용된 SUBQUERY에 따라 DML 명령어로 조작이 불가능할 수 있다.
    1. 뷰 정의에 포함되지 않은 컬럼을 조작하는 경우
    2. 뷰에 포함되지 않은 컬럼 중에 베이스가 되는 테이블 컬럼이 NOT NULL 제약조건이 지정된 경우
    3. 산술 표현식이 정의된 경우
    4. JOIN을 이용해 여러 테이블을 연결한 경우
    5. DISTINCT를 포함한 경우
    6. 그룹함수나 GROUP BY 절을 포함한 경우
-- 1. VIEW INSERT 
INSERT 
  INTO hansik
VALUES (99, '수정과맛국밥', 5500, 4, 'Y');  

-- INSERT INTO hansik VALUES (null, '식혜맛국밥', 5500, 4, 'Y');    -- 에러 발생

-- 2. VIEW UPDATE 
UPDATE hansik
   SET menu_name = '버터맛국밥', menu_price = 5700 
 WHERE menu_code = 99;

-- 3. VIEW DELETE
DELETE FROM hansik WHERE menu_code = 99;

SELECT * FROM hansik;
SELECT * FROM tbl_menu;

 

 

4. VIEW 삭제 (DROP VIEW)

DROP VIEW hansik;

 

5. VIEW 옵션 

  • OR REPLACE : 이미 같은 이름의 뷰를 생성할 경우 존재하고 있는 뷰를 갱신 (덮어쓰기)
  • CHECK : 뷰를 통한 데이터 변경시 뷰 정의 조건을 만족하지 않는 데이터는 추가/수정 불가하도록 제한하는 옵션
    • WITH LOCAL CHECK OPTION : 뷰 자체 조건만 검사
    • WITH CASCADED CHECK OPTION : 상위 뷰의 조건까지 검사 (default)
-- 1. OR REPLACE 
CREATE OR REPLACE VIEW hansik AS
SELECT 
       menu_code 
     , menu_name
     , menu_price
     , category_code
     , orderable_status
  FROM tbl_menu 
 WHERE category_code = 4;

-- 2. CHECK
CREATE VIEW hansik_with_check AS
SELECT 
       menu_code 
     , menu_name
     , menu_price
     , category_code
     , orderable_status
  FROM tbl_menu 
 WHERE category_code = 4
 WITH CHECK OPTION; 
 
INSERT INTO hansik VALUES (100, '감자탕', 8000, 3, 'Y'); -- 성공 
INSERT INTO hansik_with_check VALUES (101, '감자탕', 8000, 3, 'Y'); -- 실패, category_code = 4 X