DB View에 관해서

알비레오·2025년 9월 11일

DB

목록 보기
14/16

View

정의
실제 데이터를 저장하지 않고, 저장된 SQL 쿼리문을 통해 실제 테이블 처럼 보여주는 가상 테이블

특징
1. 가상 테이블 - 물리적으로 존재하지 않고 논리적으로 존재함
2. 데이터 저장 x - 기본 테이블에서 실시간으로 데이터 조회

장점
1. 데이터 보안 강화 - 민감 데이터 노출을 제한할 수 있음
2. 복잡한 쿼리 단순화 - 복잡한 조인이나 계산식 감춤
3. 논리적 독립성 제공 - 기본 테이블 변경 시 응용프로그램 영향 최소화
4. 제한된 갱신 가능성 - 일부 조건에 한해 뷰를 통한 데이터 삽입, 수정, 삭제 가능
5. 다양한 뷰 활용 - 보고서, 권한 관리, 데이터 통합 등 다양한 목적에 사용

단점
1. 성능 문제 - 물리적으로 저장되지 않고 매번 기본 테이블에서 조회되므로, 대용량 데이터나 복잡한 뷰에서는 성능 이슈가 발생할 수 있음
2. 데이터 갱신 제약 - 뷰를 통한 INSERT, UPDATE, DELETE 작업은 제약이 많고, 특히 복합 뷰나 집계가 포함된 뷰에서는 갱신이 불가능한 경우가 많음
3. 인덱스 부재 - 뷰 자체에는 인덱스를 생성할 수 없어 조회 시 성능 최적화에 한계가 있음
4. 뷰 정의 변경의 제약 - 한번 생성된 뷰는 직접 수정이 어려워, 변경하려면 삭제 후 재생성해야 하는 불편함이 있음

View 만들기

구성

CREATE VIEW 뷰이름 AS
SELECT 컬럼1, 컬럼2, ...
FROM 테이블명
WHERE 조건;

예시 쿼리

CREATE VIEW emp_view AS
SELECT emp_id, emp_name, emp_salary
FROM employees
WHERE emp_salary > 50000;

View가 어떤 쿼리문으로 만들어졌는지 확인 방법

1. ORACLE

SELECT text FROM user_views WHERE view_name = '뷰이름';
-- 또는
SELECT dbms_metadata.get_ddl('VIEW','뷰이름') FROM dual;

2. MySQL/MaraDB

SHOW CREATE VIEW 뷰이름;

3. PostgreSQL

SELECT definition FROM pg_views WHERE viewname = '뷰이름';

View 스키마 수정

View 스키마 수정??

1. view를 이루고 있는 테이블의 스키마를 수정한다.
2. view를 수정한다

View 수정방법 2가지

1. 기존 뷰를 새 쿼리로 덮어쓰기

CREATE OR REPLACE VIEW 뷰이름 AS
SELECT 컬럼1 AS 새컬럼명1, 컬럼2, ...
FROM 테이블명
WHERE 조건;

2. 기존 뷰 삭제 후 재생성

DROP VIEW IF EXISTS 뷰이름;

CREATE VIEW 뷰이름 AS
SELECT ...
FROM ...
WHERE ...;

View에서 insert, update, delete 사용

1. INSERT

  • 뷰가 단일 테이블 기반이고, NOT NULL 조건을 만족하는 모든 컬럼을 포함할 때 가능
  • 뷰 정의에 포함되지 않은 NOT NULL 컬럼이 있으면 실패

예시 쿼리

CREATE VIEW v_emp AS
SELECT empno, ename, job
FROM emp
WHERE job = 'MANAGER';

INSERT INTO v_emp VALUES (8888, '홍길동', 'MANAGER');
  • 이 경우 실제 기본 테이블 emp에 행이 삽입됨
  • 뷰에 WITH CHECK OPTION을 추가하면, 뷰 조건에 맞는 데이터만 삽입 가능하며, 조건을 위반하면 오류

2. UPDATE

  • 단일 테이블 기반 뷰는 수정 가능
  • 뷰에서 수정한 내용은 기본 테이블에 반영됨
  • 복잡한 뷰(조인, 그룹함수 포함)는 UPDATE 불가

예시 쿼리

UPDATE v_emp
SET job = 'SALES'
WHERE empno = 8888;

3. DELETE

  • 단일 테이블 기반 뷰에서 삭제 가능
  • 삭제는 기본 테이블의 행을 삭제하는 효과
  • 복잡한 뷰에서는 제한됨

예시 쿼리

DELETE FROM v_emp WHERE empno = 8888;

0개의 댓글