쯔이's Dev
VIEW 본문
SELECT문(쿼리문)을 저장해둘 수 있는 객체
(자주 사용하는 SELECT문을 저장해두면 너무 긴 SELECT문을 매번 다시 기술할 필요없이 뷰명만을 써서 간략히 사용할 수 있다.)
임시테이블 같은 존재
(실제 데이터가 담겨있는 건 아니다 -> 논리테이블)
1. VIEW 생성방법
[표현식]
* 보통 뷰명은 TB_ // VW_이렇게 시작한다.
CREATE VIEW 뷰명 AS
(서브쿼리)
* CREATE OR REPLACE를 사용하면 VIEW가 없을 때는 생성, 이미존재한다면 수정할 수 있다.
CREATE OR REPLACE VIEW 뷰명 AS
( 서브쿼리)
* 뷰 컬럼에 별칭 부여
서브쿼리의 SELECT절에 함수식이나 산술연산식이 기술되어있다면 반드시 별칭을 부여해야한다.
CREATE OR REPLACE VIEW vw_emp_job AS
( SELECT
emp_id,
emp_name,
job_name,
decode(substr(emp_no, 8, 1), '1', '남', '2', '여') AS "성별",
EXTRACT(YEAR FROM sysdate) - EXTRACT(YEAR FROM hire_date) AS "근무년수"
FROM
employee
JOIN job USING ( job_code )
);
* 뷰를 삭제하고싶을 떄
DROP VIEW 뷰명;
* 생성된 뷰를 통해서 DML(INSERT, UPDATE, DELETE) 사용가능
뷰를 통해서 조작하게되면 실제 데이터가 담겨있는 테이블에 반영이 된다.
EX)
INSERT INTO vw_job VALUES (
'J8',
'인턴'
);
EX)
UPDATE vw_job
SET
job_name = '알바'
WHERE
job_code = 'J8';
* DML 명령어로 조작이 불가능한 경우가 많다
- 뷰에 정의되어있지 않은 컬럼을 조작하려고하는 경우
- 뷰에 정의되어있지 않은 컬럼 중에 베이스테이블 상에 NOT NULL제약조건이 지정되어있는 경우
- 산술연산식이나 함수식을 사용한 경우
- 그룹함수나 GROUP BY절을 포함한 경우
- DISITINCT구문이 포함된 경우
- JOIN을 이용해서 여러테이블을 연결시켜놓은 경우
대부분 뷰는 조회를 목적으로 생성한다. 그냥 뷰를 통한 DML은 안쓰는게 좋다
VIEW 옵션
[상세표현식]
CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW 뷰명
AS 서브쿼리
[WITH CHECK OPTION]
[WITH READ ONLY];
1) OR REPLACE : 기존에 동일한 뷰가 있을 경우 갱신하고, 없을 경우 새로 생성해라
2) FORCE | NOFORCE
> FORCE : 서브쿼리에 기술된 테이블이 존재하지 않아도 뷰가 생성되도록해라
CREATE OR REPLACE FORCE VIEW vw_emp AS
SELECT
tcode,
tname,
tcontent
FROM
tt;
> NOFORCE : 서브쿼리에 기술된 테이블이 존재하는 테이블이여야만 한다(기본값)
CREATE OR REPLACE NOFORCE VIEW vw_emp AS
SELECT
tcode,
tname,
tcontent
FROM
tt;
3) WITH CHECK OPTION : DML시 서브쿼리에 기술된 조건에 부합한 값으로만 DML이 가능하도록. 서브쿼리에 기술된 조건에 부합하지 않는 값으로 수정시 오류 발생
CREATE OR REPLACE VIEW vw_emp AS
SELECT
*
FROM
employee
WHERE
salary >= 3000000
WITH CHECK OPTION;
UPDATE vw_emp
SET
salary = 2000000
WHERE
emp_id = 200;
4) WITH READ ONLY : 뷰에 대해서 조회만 가능하도록
CREATE OR REPLACE VIEW vw_emp AS
SELECT
emp_id,
emp_name,
bonus
FROM
employee
WHERE
bonus IS NOT NULL
WITH READ ONLY;
DELETE FROM vw_emp
WHERE
emp_id = 200;