DB/오라클(Oracle)

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

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

뷰(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가 상황에 따라 불가능할 수 있다.