뷰 (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이 포함된 경우 뷰 정의에서 서브쿼리가 포함된 경우 - 뷰 정의에 상수, 문자열 등이 포함된 경우 |
'데이터베이스 > MySQL' 카테고리의 다른 글
[MySQL] 인덱스(INDEX)의 생성, 삭제, 조회, 수정 (0) | 2021.06.02 |
---|---|
[MySQL] 데이터 사전(Data Dictionary) (0) | 2021.06.02 |
[MySQL] DCL 활용(2) - 트랜잭션 COMMIT, ROLLBACK (0) | 2021.06.01 |
[MySQL] DCL 활용(1) - 사용자 권한부여(GRANT), 권한취소(REVOKE) (0) | 2021.06.01 |
[MySQL] DML 활용 - 테이블에 데이터(튜플) 추가, 수정, 삭제하기 (0) | 2021.06.01 |