데이터베이스/MySQL

[MySQL] 뷰(VIEW)의 생성, 조회, 삭제, 수정

webvillain 2021. 6. 2. 13:42

뷰 (VIEW)

뷰는 데이터가 데이터베이스에 물리적으로 저장되지 않기 때문에 가상테이블 또는 원천데이터를 조회할 수 있는 저장된 쿼리 라고 합니다.

 

복잡하고 긴 쿼리문을 뷰로 정의하면 접근을 단순화시킬 수 있고, 보안에 유리합니다.

사용자마다 특정 객체만 조회할 수 있도록 권한을 부여를 할 수 있기에 동일한 테이블을 접근하는 사용자마다에 따라 서로 다르게 보도록 여러 개의 뷰를 정의해 놓고 특정 사용자만이 해당 뷰에 접근할 수 있도록 합니다.

 

▶ 뷰의 장점

뷰 장점 내용
논리적 독립성 제공 뷰는 논리 테이블임 (테이블의 구조가 변경되어도 뷰를 사용하는 응용 프로그램은 변경하지 않아도 됨)
사용자 데이터 관리 용이 복수 테이블에 존재하는 여러 종류의 데이터에 대해 단순한 질의어 사용이 가능
데이터 보안 용이 중요 보안 데이터를 저장 중인 테이블에는 접근 불가하고, 해당 테이블의 일부 정보만을 볼수 있는 뷰에는 접근을 허용하는 방식으로 보안 데이터에 대한 접근 제어 가능

 

뷰의 단점

뷰 단점 내용
뷰 자체 인덱스 불가 인덱스는 물리적으로 저장된 데이터를 대상으로 하기에 논리적 구성인 뷰 자체는 인덱스를 가지지 못함
뷰 정의 변경 불가 뷰의 정의를 변경하려면 뷰를 삭제하고 재생성하여야 함
데이터 변경 제약 존재 뷰의 내용에 대한 삽입, 삭제, 변경 제약이 있음

 

뷰의 종류

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

 


 

먼저, 뷰를 생성하기 전에 'notice' 와 'members' 테이블을 준비하겠습니다.

 

 


 

1. 뷰 생성

  CREATE VIEW  뷰이름 (컬럼목록)  AS  <뷰를 통해 보여줄 데이터 조회용 쿼리문>
  [ WITH CHECK OPTION  [CONSTRAINT  제약조건] ]
  [ WITH READ ONLY ];

- WITH CHECK OPTION : 주어진 제약조건에 맞는 데이터만 입력 및 수정을 허용

- WITH READ ONLY : SELECT만 가능한 읽기 전용 뷰 생성

 

상황 뷰 생성 쿼리문
단순뷰   CREATE VIEW  뷰이름  AS  select * from  테이블A;
  CREATE VIEW  뷰이름  AS  select  컬럼명1  [, 컬럼명2, 컬럼명3...]  from  테이블A;
복합뷰
(테이블A와 테이블B 조인)
  CREATE VIEW  뷰이름  AS  select * from  테이블A a, 테이블B b  where  a.컬럼명 = b.컬럼명;
  CREATE VIEW  뷰이름  AS
  select
  a.컬럼명1, a.컬럼명2, b.컬럼명3...  
  from  테이블A a, 테이블B b 
  where a.컬럼명1 = b.컬럼명3;

 

(1) 특정 컬럼으로 구성된 뷰 생성 (단순뷰 & 복합뷰)

▶ 단순뷰

-- 'mem_id', 'mem_pwd' 컬럼을 보여주는 뷰 생성
CREATE VIEW check_login_view AS select mem_id, mem_pwd from members;

-- 'mem_reg_date' 기준으로 오름차순 정렬하는 'mem_id', 'mem_pwd', 'mem_reg_date' 컬럼을 보여주는 뷰 생성
CREATE VIEW check_mem_reg_date_view AS 
select mem_id, mem_pwd, mem_reg_date from members order by mem_reg_date;

 

▶ 복합뷰

-- 테이블'notice'의 'title', 'author'컬럼과 테이블'members'의 'mem_nm', 'mem_reg_date'컬럼을 조인하는 뷰 생성
CREATE VIEW notice_author_list AS
SELECT a.title, a.author, b.mem_reg_date
FROM notice a, members b 
WHERE a.author = b.mem_nm;

 

(2) IN 조건절로 이루어진 뷰 생성

-- 'notice'테이블에서 'author'컬럼이 '관리자', '홍길동'인 튜플의 'author', 'wr_date'컬럼을 보여주는 뷰 생성
CREATE VIEW notice_author_view AS
SELECT author, wr_date FROM notice WHERE author in('관리자', '홍일동');

-- 'members'테이블에서 'birth_dr'가 1992로 시작하는 튜플의 'idx', 'mem_nm', 'birth_dt'컬럼을 보여주는 뷰 생성
CREATE VIEW check_age_view AS
SELECT idx, mem_nm, birth_dt FROM members WHERE birth_dt like '1992%';

 

(3) 계산식을 포함하는 뷰

CREATE VIEW check_joinday_view (idx, mem_nm, mem_id, mem_reg_date, joindays) AS 
select idx, mem_nm, mem_id, mem_reg_date, ( Now() - Date(mem_reg_date) ) 
from members;

 


 

2. 뷰 조회

  SELECT * FROM  뷰이름;

 


 

3. 뷰 삭제

  DROP VIEW  뷰이름;

 

 

4. 뷰 수정

  ALTER VIEW  뷰이름  AS
  SELECT 컬럼명1  [, 컬럼명2, ...]  FROM  테이블명  [WHERE 조건];
뷰 수정 가능 여부 내용
  가능한 경우 - 뷰가 하나의 테이블에서 정의된 경우
- 뷰 생성에 사용된 테이블의 PK를 포함하는 경우
  불가능한 경우 - 뷰 정의에서 집계 함수로 정의된 컬럼이 있는 경우
- 뷰 정의에서 DISTINCT가 포함된 경우
- 뷰 정의에서 GROUP BY 또는 HAVING이 포함된 경우 뷰 정의에서 서브쿼리가 포함된 경우
- 뷰 정의에 상수, 문자열 등이 포함된 경우