VIEW(뷰)란?
: 하나 이상의 테이블에서 데이터를 조회하는 가상의 테이블
: 실제 데이터를 저장하지 않고, SQL 쿼리 결과를 테이블처럼 활용할 수 있다.
: 복잡한 쿼리를 단순하게 만들고, 보안 및 데이터 관리에도 유용하다.
즉, 뷰는 데이터를 저장하지 않고, 원본 테이블을 바라보는 창(윈도우) 역할이라고 생각하면 편함
VIEW의 특징
1. 가상 테이블
- 뷰는 물리적으로 데이터를 저장하지 않음
- 원본 테이블을 기반으로 동작
2. 데이터 보안
- 특정 컬럼이나 행만 선택하여 접근 권한을 제한할 수 있음
3. 복잡한 SQL을 단순화
- 여러 테이블을 조인하는 복잡한 쿼리를 미리 정의하여 간단하게 사용 가능
4. 업데이트 가능 여부
- 일반적으로 SELECT만 가능
VIEW 주의할 점
1. ORDER BY 사용 불가 (뷰 자체에서 정렬 X, 조회할 때만 가능)
2. 일부 INSERT, UPDATE, DELETE 제한됨 (JOIN 포함된 경우 등)
3. 성능 문제 (뷰가 복잡할수록 실행 속도 저하 가능)
VIEW 생성, 조회, 수정, 삭제
1. VIEW 생성 (CREATE VIEW)
예제: employees 테이블에서 id, name, salary만 보이는 뷰 생성
CREATE VIEW emp_view AS
SELECT id, name, salary
FROM employees;
: emp_view는 employees 테이블의 일부 컬럼을 포함한 가상 테이블
: emp_view를 사용하면 employees 테이블을 직접 접근하지 않고도 데이터를 조회 가능
2. VIEW 조회 (SELECT)
SELECT * FROM emp_view;
: emp_view를 일반 테이블처럼 사용 가능
: id, name, salary 컬럼만 출력됨
3. VIEW 수정 (ALTER VIEW or CREATE OR REPLACE VIEW)
CREATE OR REPLACE VIEW emp_view AS
SELECT id, name, salary, department_id
FROM employees;
: 기존 emp_view를 수정하여 department_id 컬럼 추가
ALTER VIEW / CREATE OR REPLACE VIEW : 이 두개는 기능이 동일함
4. VIEW 삭제 (DROP VIEW)
DROP VIEW emp_view;
: emp_view 뷰 삭제
: 원본 테이블(employees)에는 영향 없음
VIEW : SELECT / INSERT / UPDATE / DELETE / WITH READ ONLY
실행문 | 실행 결과 |
SELECT | 원본 테이블(jobs)의 데이터 조회 |
INSERT | 원본 테이블(jobs)에도 데이터 추가됨 |
UPDATE | 원본 테이블(jobs)에도 반영됨 |
DELETE | 원본 테이블(jobs)에서도 삭제됨 |
WITH READ ONLY 사용 | INSERT, UPDATE, DELETE 불가능 (읽기 전용) |
뷰에 INSERT하면 원본 테이블에도 데이터 추가됨
create view ub_view as
select job_id, job_title, max_salary
from jobs;
insert into ub_view(job_id, job_title, max_salary)
values('DEV_PER', '개발자', 12000);
: ub_view에 데이터 삽입하는 것은 결국 jobs 테이블에 삽입하는 것과 동일
뷰에서 DELETE하면 원본 테이블에서도 삭제됨
DELETE FROM ub_view WHERE job_id = 'DEV_PER';
: ub_view에서 데이터를 삭제하면 원본 테이블인 jobs에서도 해당 데이터가 삭제됨
읽기 전용 뷰 생성
CREATE VIEW ub_view AS
SELECT job_id, job_title, max_salary
FROM jobs
WITH READ ONLY;
: 이제 ub_view에서 INSERT, UPDATE, DELETE를 실행하면 오류 발생
VIEW의 활용 예시
1. 보안 강화 (민감한 정보 숨기기)
: employees 테이블에서 salary는 제외하고 조회 가능하도록 설정
CREATE VIEW emp_safe_view AS
SELECT id, name, department
FROM employees;
: emp_safe_view를 사용하면 salary 정보 없이 조회 가능
2. 복잡한 조인을 단순하게
: employees와 departments 테이블을 조인한 뷰 생성
CREATE VIEW emp_dept_view AS
SELECT e.id, e.name, e.salary, d.department_name
FROM employees e JOIN departments d
ON e.department_id = d.department_id;
SELECT * FROM emp_dept_view;
: emp_dept_view를 사용하면 매번 조인을 수행할 필요 없이 단순하게 조회 가능