정의
실제 데이터를 저장하지 않고, 저장된 SQL 쿼리문을 통해 실제 테이블 처럼 보여주는 가상 테이블특징
1. 가상 테이블 - 물리적으로 존재하지 않고 논리적으로 존재함
2. 데이터 저장 x - 기본 테이블에서 실시간으로 데이터 조회장점
1. 데이터 보안 강화 - 민감 데이터 노출을 제한할 수 있음
2. 복잡한 쿼리 단순화 - 복잡한 조인이나 계산식 감춤
3. 논리적 독립성 제공 - 기본 테이블 변경 시 응용프로그램 영향 최소화
4. 제한된 갱신 가능성 - 일부 조건에 한해 뷰를 통한 데이터 삽입, 수정, 삭제 가능
5. 다양한 뷰 활용 - 보고서, 권한 관리, 데이터 통합 등 다양한 목적에 사용단점
1. 성능 문제 - 물리적으로 저장되지 않고 매번 기본 테이블에서 조회되므로, 대용량 데이터나 복잡한 뷰에서는 성능 이슈가 발생할 수 있음
2. 데이터 갱신 제약 - 뷰를 통한 INSERT, UPDATE, DELETE 작업은 제약이 많고, 특히 복합 뷰나 집계가 포함된 뷰에서는 갱신이 불가능한 경우가 많음
3. 인덱스 부재 - 뷰 자체에는 인덱스를 생성할 수 없어 조회 시 성능 최적화에 한계가 있음
4. 뷰 정의 변경의 제약 - 한번 생성된 뷰는 직접 수정이 어려워, 변경하려면 삭제 후 재생성해야 하는 불편함이 있음
구성
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;
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 스키마 수정??
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 ...;
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;