DB/오라클(Oracle)

[Oracle] 오라클 뷰(VIEW) 사용법

푸코잇 2023. 12. 9. 22:33

뷰(VIEW) 란?

오라클에서 제공하는 뷰(VIEW)는 하나 이상의 테이블이나 다른 뷰의 데이터로 만든 가상 테이블이다.

자주 조회하는 데이터를 뷰에 구성함으로써 복잡한 쿼리문을 매번 작성할 필요가 없다.

또한, 조회하는 데이터의 원천 테이블을 알 수 없기 때문에 보안성도 좋다.

CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW 뷰이름 [(칼럼명1, 칼럼명2, ...)]
AS SELECT 문
[WITH READ ONLY]
[WITH CHECK OPTION [CONSTRAINT 제약조건명]]

 

  • OR REPLACE : 기존에 생성한 뷰가 없으면 생성하고 있다면 수정한다.
  • FORCE : 생성 시 쿼리문의 테이블, 칼럼, 함수 등이 존재하지 않아도 생성한다.(INVALID 상태이므로 동작하지 않는다.)
  • NOFORCE : 생성 시 쿼리문의 테이블, 칼럼, 함수 등이 존재하지 않으면 생성되지 않는다.
  • 칼럼명 설정 : SELECT문에서 선택한 칼럼의 별칭을 설정할 수 있다.(개수 일치 필요)
  • WITH READ ONLY : 읽기 전용 뷰로 생성한다. (INSERT, DELETE, UPDATE 불가능)
  • WITH CHECK OPTION : 제약조건을 만족 시 INSERT, DELETE, UPDATE 가능

 

뷰 생성

-- DEPT 테이블의 DEPTNO, DNAME 칼럼을 볼 수 있는 VIEW_DEPT 뷰 생성
CREATE VIEW VIEW_DEPT
AS SELECT DEPTNO, DNAME FROM DEPT;

-- VIEW_DEPT 데이터 조회
SELECT * FROM VIEW_DEPT;

CREATE-VIEW
VIEW_DEPT 뷰 데이터 조회 결과

 

DEPT 테이블에서 DEPTNO, DNAME 칼럼을 볼 수 있는 VIEW_DEPT 뷰를 생성했다.

뷰 데이터 조회 시 테이블과 동일하게 SELECT문을 사용하면 된다.

 

INSERT, UPDATE, DELETE 실행

-- TECHNICAL 부서 추가
INSERT INTO VIEW_DEPT VALUES(50, 'TECHNICAL');

-- DEPTNO가 20인 부서의 이름을 COMMERCIAL로 변경
UPDATE VIEW_DEPT SET DNAME = 'COMMERCIAL' WHERE DEPTNO = 20;

-- DEPTNO가 10인 부서 삭제
DELETE FROM VIEW_DEPT WHERE DEPTNO = 10;

 

뷰에서 INSERT, UPDATE, DELETE 실행 시 원본 테이블인 DEPT에도 영향이 간다.

 

뷰 수정

-- OR REPLACE를 통해 뷰 수정 (WITH READ ONLY를 통해 읽기전용)
CREATE OR REPLACE VIEW VIEW_DEPT
AS SELECT DEPTNO, DNAME FROM DEPT
WITH READ ONLY;

읽기전용 뷰 INSERT, DELETE, UPDATE 시 발생하는 에러

 

OR REPLACE를 통해 기존에 생성된 뷰를 수정할 수 있다.

WITH READ ONLY를 통해 읽기전용으로 수정하여 INSERT, DELETE, UPDATE 시 에러가 발생한다.

 

뷰 삭제

DROP VIEW VIEW_DEPT;

 

뷰 사용 시 주의사항

-- EMPLOYEES 테이블에서 사원이름과 그 사원의 매니저이름이 있는 EMPLOYEES_MANAGER 뷰 생성
CREATE VIEW EMPLOYEES_MANAGER
AS 
(
	SELECT E1.LAST_NAME||' '||E1.FIRST_NAME AS ENAME, E2.LAST_NAME||' '||E2.FIRST_NAME AS MNAME
	FROM HR.EMPLOYEES E1 JOIN HR.EMPLOYEES E2
	ON E1.MANAGER_ID = E2.EMPLOYEE_ID
);
SELECT * FROM EMPLOYEES_MANAGER;

 

함수, 조인, GROUP BY, UNION 등을 사용하여 뷰 생성 시 주의사항이 있다.

가상열이나 함수를 사용한 경우 칼럼 별칭을 부여하지 않으면 에러가 발생한다.

또한, INSERT, DELETE, UPDATE가 상황에 따라 불가능할 수 있다.