본문 바로가기

Programming/SQL(Oracle)

DAY 64. [DataBase] 객체 VIEW

 

VIEW

SELECT 쿼리의 실행 결과를 화면에 저장한 논리적 가상 테이블이다.

실제 테이블과는 다르게 실질적 데이터를 저장하고 있진 않지만 사용자는 테이블을 사용하는 것과 동일하게 사용이 가능하다.

실제 데이터를 저장하는 게 아니라 SQL 쿼리문을 가지고 있는 것이다.

 

** 서브쿼리의 SELECT 절에 함수가 사용된 경우 반드시 별칭을 지정해야 한다.

** 생성된 뷰를 가지고 DML 구문(INSERT, UPDATE, DELETE) 사용이 가능하다.

** 생성된 뷰에 요청한 DML 구문은 베이스 테이블의 데이터들도 변경이 가능하다.

 

  • VIEW 옆에 ( 컬럼 별칭 )을 지정할 수 있다. 대신에 이 방법은 서브 쿼리 안에 있는 모든 컬럼들에도 별칭을 부여해야 한다.
  • 서브 쿼리의 SELECT 절에 함수나 산술 연산이 기술되어 있는 경우 반드시 별칭을 지정해야 한다.

 


 

DML 명령어로 VIEW 조작이 불가능 한 경우

 

  • 뷰 정의에 포함되지 않는 컬럼을 조작하는 경우

** 뷰 정의에 포함되지 않은 컬럼을 INSERT/UPDATE 하는 경우 에러 발생

** 뷰에서 정의한 컬럼의 갯수와 INSERT하려고 하는 컬럼의 갯수가 동일해야 한다.

 

 

  • 뷰에 포함되지 않은 컬럼 중에 베이스가 되는 컬럼이 NOT NULL 제약조건이 지정된 경우

** 뷰에 포함되지 않은 NOT NULL 제약 조건이 있는 컬럼이 존재하면 INSERT 시 에러 발생

** UPDATE/DELETE 는 가능하다.

 

 

  • 산술 표현식으로 정의된 경우

** 뷰에 산술 계산식에 포함된 경우 INSERT/UPDATE 시 에러 발생

** 단, DELETE는 가능하다.

 

 

  • 그룹 함수나 GROUP BY 절을 포함한 경우

** 그룹함수 또는 GROUP BY를 사용한 경우 INSERT/UPDATE/DELETE 시 에러 발생

 

 

  • DISTINCT를 포함한 경우

** DISTINCT를 사용한 경우 INSERT/UPDATE/DELETE 시 에러 발생

 

 

  • JOIN을 이용해 여러 테이블을 연결한 경우

** 뷰 정의 시 JOIN을 사용한 경우 INSERT/UPDATE 시 에러 발생

** 단, DELETE는 가능하다.

 

 


 

VIEW 구조

뷰 정의시 사용한 쿼리 문장이 TEXT 컬럼에 저장되어 있다.

뷰가 실행될 때는 TEXT에 기록된 SELECT에 문장이 다시 실행되면서 결과를 보여주는 구조이다.

SELECT * FROM USER_VIEWS;

 

 


 

VIEW 옵션

 

1. OR REPLACE 옵션

  • 생성한 뷰가 존재하면 뷰를 갱신함

2. FORCE/NOFORCE 옵션

  • FORCE 옵션은 기본 테이블이 존재하지 않더라도 뷰 생성 NOFORCE 옵션이 기본 값으로 지정되어 있음

3. WITH CHECK OPTION 옵션

  • 옵션을 설정한 컬럼의 값을 수정 불가능하게 함**(삭제는 가능)**

4. WITH READ ONLY 옵션

  • 뷰에 대해 조회만 가능하고 삽입, 수정, 삭제 등은 불가능하게 한다. (DML 불가능)

 


 

인라인 뷰(INLINE - VIEW)

일반적으로 FROM절에 사용된 서브쿼리의 결과 화면에 별칭을 붙인 것

FROM절에 서브쿼리를 직접 사용해도 되고 따로 뷰를 생성한 후에 FROM절에 생성한 뷰를 사용해도 된다.