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 조작이 불가능하다:
- 산술 연산식을 사용하여 VIEW를 만든 경우
- VIEW 정의에 포함되지 않은 컬럼을 조작하는 경우
- VIEW에 포함되지 않은 컬럼 중에 베이스 테이블 컬럼에 NOT NULL 제약조건이 지정된 경우
- JOIN을 이용해 여러 테이블을 연결한 경우
- DISTINCT를 포함한 경우
- 그룹 함수나 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
'수업자료 > database' 카테고리의 다른 글
[Linux]- 리눅스 개요 (0) | 2024.07.08 |
---|---|
[SQL]-TRIGGER (0) | 2024.06.27 |
[SQL]-CONSTRAINT(제약조건) (0) | 2024.06.27 |
[SQL]-DDL (1) | 2024.06.26 |
[SQL]-TRANSACTION (0) | 2024.06.26 |