뷰(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;
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;
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가 상황에 따라 불가능할 수 있다.
'DB > 오라클(Oracle)' 카테고리의 다른 글
[Oracle] 오라클 PL/SQL(IF, CASE, LOOP, WHILE, FOR) (0) | 2023.12.12 |
---|---|
[Oracle] 오라클 테이블 구조 및 데이터 복사하기 (2) | 2023.12.06 |
[Oracle] 오라클 JOIN 사용법 (2) | 2023.12.04 |
[Oracle] 오라클 서브쿼리(SubQuery) 사용법 (4) | 2023.12.03 |
[Oracle] 오라클 GROUP BY, HAVING 사용법 (2) | 2023.12.02 |