Theory
Database

뷰 (View)

  • 물리적인 테이블을 근거한 논리적인 가상 테이블이다.
  • 테이블에는 데이터가 있지만 뷰에는 데이터가 없고 SQL만 저장되어 있다.
  • 조인문 사용의 최소화로 사용상의 편의성을 최대화 한다.

뷰 사용시 장단점

  • 장점
    • 논리적 데이터 독립성을 제공한다.
    • 동일 데이터에 대해 동시에 여러 사용자의 상이한 응용이나 요구를 지원한다.
    • 복잡하고 긴 쿼리문의 접근을 단순화시킨다.
    • 접근 제어를 통한 자동 보안을 제공한다.

  • 단점
    • 독립적인 인덱스를 가질 수 없다.
    • ALTER VIEW 문을 사용할 수 없다. 즉, 뷰의 정의를 변경할 수 없다.
    • 뷰로 구성된 내용에 대한 삽입, 갱신, 연산에 제약이 따른다.
      • view의 정의에 포함되지 않은 컬럼중에 기본 테이블의 컬럼이 NOT NULL 제약 조건이 지정되어 있는 경우 INSERT 문 사용이 불가하다.
      • view의 정의에 포함되있지 않은 컬럼의 값을 변경할 수 없다.

view 삽입, 갱신 연산 제약 예시

CREATE TABLE 고객 (
    고객ID INT PRIMARY KEY,
    이름 VARCHAR(100),
    주소 VARCHAR(200),
    등록일자 DATE NOT NULL
);

👆와 같은 테이블이 있고 이 테이블을 참조하는

CREATE VIEW 서울고객 AS
SELECT 고객ID, 이름, 주소
FROM 고객
WHERE 주소 LIKE '%서울%';

이런 view가 있다고 가정할 때 등록일자 column은 not null 조건이 포함되어 있기 때문에 위 view를 사용해서 insert 문은 사용할 수 없고 또한 서울고객 view를 사용해서 등록일자 column을 변경할 수 없다.


뷰 문법

뷰 정의문

--문법--
CREATE VIEW 뷰이름[(속성이름[,속성이름])]AS SELECT문;
 
--고객 테이블에서 주소가 서울시인 고객들의 성명과 전화번호를 서울고객이라는 뷰로 만들어라--
CREATE VIEW 서울고객(성명, 전화번호)
AS SELECT 성명 전화번호
   FROM 고객
   WHERE 주소 = '서울시';

뷰 삭제문

  • 뷰는 재정의 할 수 없으므로 필요한 경우 삭제한 후 재생성해야 한다.
  • 뷰를 삭제해도 기본 테이블의 구조나 데이터에는 전혀 영향을 주지 않는다.
--문법--
DROP VIEW 뷰이름 RESTRICT or CASCADE
 
--서울고객이라는 뷰를 삭제해라--
DROP VIEW 서울고객 RESTRICT;
  • RESTRICT: 뷰를 다른 곳에서 참조하고 있으면 삭제하지 않는다.
  • CASCADE: 뷰를 참조하는 다른 뷰나 제약조건까지 모두 삭제한다.

Restrict 예시

CREATE VIEW 서울고객 AS
SELECT 고객ID, 이름, 주소
FROM 고객
WHERE 주소 LIKE '%서울%';

다음과 같은 뷰가 있다고 가정하고

CREATE VIEW 서울고객정보 AS
SELECT 이름, 주소
FROM 서울고객
WHERE 이름 LIKE '김%';

다음처럼 서울고객이라는 view를 참조하는 view가 있을 때 RESTRICT 옵션을 걸면 삭제되지 않는다.


단순 뷰와 복합 뷰


단순 뷰복합 뷰
하나의 테이블로 생성여러 개의 테이블로 생성
그룹 함수의 사용이 불가능그룹 함수의 사용이 가능
DISTINCT 사용이 불가능DISTINCT 사용이 가능
DML 사용이 가능DML 사용이 불가능

단순 뷰에서 DML 명령어 사용이 불가능한 경우

  • 뷰 정의에 포함되지 않은 컬럼중에 기본 테이블의 컬럼이 NOT NULL 제약 조건이 지정되어 있는 경우 INSERT 문 사용이 불가하다.
  • 뷰에 대한 INSERT 문은 기본 테이블에 NULL 값을 입력하는 형태가 되기 때문이다.
  • DISTINCT를 포함한 경우에도 DML 명령 사용이 불가하다.


ref

가상 테이블인 뷰 (opens in a new tab)
단순 뷰와 복합 뷰 (opens in a new tab)
[DB기초] 뷰(View)란 무엇인가? + 간단한 예제 (opens in a new tab)