조찬국 2024. 6. 27. 12:51
728x90

1. VIEW

1-1. view란?

 
💡 SELECT 쿼리문을 저장한 객체로 가상테이블이라고 불린다. 실질적인 데이터를 물리적으로 저장하고 있지 않고 쿼리만 저장했지만 테이블을 사용하는 것과 동일하게 사용할 수 있다.
즉, VIEW는 원본 테이블을 참조해서 보여주는 용도이고, 보여지는건 실제 테이블(베이스 테이블)의 값이다.
VIEW는 데이터를 쉽게 읽고 이해할 수 있도록 돕는 동시에, 원본 데이터의 보안을 유지하는데 도움이 된다.
SELECT
		  menu_name
		, menu_price
	FROM tbl_menu;

위의 코드를 를 실행하면 아래와 같이 원하는 컬럼에대해서 새로운 테이블의 형태를 만들 수 있다.

이러한 새로운 테이블을 view로 사용한다.

 

1-1. 기본문법(VIEW 생성)

-- 기본 문법
CREATE VIEW v_menu
AS
SELECT
		  menu_name
		, menu_price
	FROM tbl_menu;

SELECT * FROM v_menu;

 

 

위의 결과는 앞선 결과와 동일하다. 

 

1-2. VIEW를 통한 DML

💡 VIEW를 통한 DML 작업은 베이스 테이블에도 영향을 주게 된다.
VIEW는 데이터 조작 언어(DML)를 사용하여 데이터를 추가, 수정, 삭제하는 용도로 사용되지 않는다. 그 이유는 VIEW가 단순히 원본 테이블을 참조하는 가상 테이블이기 때문이다. 그러나 예제로 이를 시도해보면 다음과 같다:

 

1. 베이스 테이블

2. VIEW 생성

CREATE OR REPLACE VIEW hansik
AS
SELECT 
    menu_code,
    menu_name,
    menu_price,
    category_code,
    orderable_status
FROM tbl_menu
WHERE category_code = 4;

 

OR REPLACE: 만들거나 치환할 수 있다. 기존 view를 drop하지 않고, 새로운 view로 치환한다.

 

VIEW를 통해 데이터를 삽입하면 원본 테이블에 영향을 준다:

INSERT INTO hansik
VALUES (NULL, '식혜맛국밥', 5500, 4, 'Y');

SELECT * FROM hansik;
SELECT * FROM tbl_menu WHERE menu_name = '식혜맛국밥';

 

VIEW를 통해 데이터를 수정하면 원본 테이블에 영향을 준다:

UPDATE hansik 
SET menu_name = '버터맛국밥',
    menu_price = 6000
WHERE menu_name = '수정과맛국밥';

SELECT * FROM hansik;
SELECT * FROM tbl_menu;

 

VIEW를 통해 데이터를 삭제하면 원본 테이블에 영향을 준다:

DELETE FROM hansik WHERE menu_code = 99;
SELECT * FROM hansik;
SELECT * FROM tbl_menu;

1-3. VIEW로 DML 조작이 불가능한 경우

💡 VIEW를 통해 DML 조작을 전부 다 할 수 있는 것은 아니다.
다음과 같은 경우에는 VIEW를 통해 DML 조작이 불가능하다:
  1. 산술 연산식을 사용하여 VIEW를 만든 경우
  2. VIEW 정의에 포함되지 않은 컬럼을 조작하는 경우
  3. VIEW에 포함되지 않은 컬럼 중에 베이스 테이블 컬럼에 NOT NULL 제약조건이 지정된 경우
  4. JOIN을 이용해 여러 테이블을 연결한 경우
  5. DISTINCT를 포함한 경우
  6. 그룹 함수나 GROUP BY 절을 포함한 경우

예시

-- 산술 연산식을 사용한 VIEW 생성
CREATE OR REPLACE VIEW v_test
AS
SELECT 
    AVG(menu_price) + 3
FROM tbl_menu;

SELECT * FROM v_test;

-- DML 조작 시도 (에러 발생)
INSERT INTO v_test VALUES (10);

1-4. VIEW 삭제

DROP VIEW hansik;

 

VIEW에 쓰인 SUBQUERY 안에 연산 결과 컬럼도 사용 가능하다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90