본문 바로가기

데이터/SQL

[혼공] 5-3장 가상의 테이블 뷰

1. 뷰의 개념

 

- 뷰의 실체는 SELECT문으로 만들어져 있기 때문에 뷰에 접근한느 순간 SELECT가 실행되고 그 결과가 화면에 출력

- 단순 뷰 : 하나의 테이블로 만든 뷰 

- 복합 뷰 : 두 개 이상의 테이블로 만든 뷰 

- 형식

CREATE VIEW 뷰_이름
AS
	SELECT문;

- 뷰에 접근하는 방식은 테이블과 동일한 SELECT문

 

ex) 회원 테이블의 아이디, 이름, 주소에 접근하는 뷰 

USE market_db;
CREATE VIEW v_member
AS
    SELECT mem_id,mem_name,addr FROM member;

SELECT * FROM v_member;

 

2. 뷰를 사용하는 이유 

 

1) 보안(security)에 도움이 됨

 

2) 복잡한 SQL을 단순하게 만듬

 

 

3. 뷰의 실제 작동

 

1) 뷰의 생성 

 

 - 뷰를 조회할 때는 열 이름에 공백이 있으면 백틱(`)으로 묶어줘야 함

USE market_db;
DROP VIEW IF EXISTS v_viewtest1;
CREATE VIEW v_viewtest1
AS
	SELECT B.mem_id 'Member ID', M.mem_name AS 'Member Name',
		B.prod_name "Product Name",
			CONCAT(M.phone1, M.phone2) AS "Office Phone"
	    FROM buy B 
            INNER JOIN member M
            ON B.mem_id = M.mem_id;
SELECT DISTINCT `Member ID`, `Member Name` FROM v_viewtest1;

 

2) 뷰의 수정 

 

- ALTER VIEW 구문 사용 

- 열 이름에 한글 사용 가능

ALTER VIEW v_viewtest1
AS
	SELECT B.mem_id '회원 아이디', M.mem_name AS '회원 이름',
		B.prod_name "제품 이름",
			CONCAT(M.phone1, M.phone2) AS "연락처"
		FROM buy B 
            INNER JOIN member M
            ON B.mem_id = M.mem_id;
            
SELECT DISTINCT `회원 아이디`, `회원 이름` FROM v_viewtest1;

 

3) 뷰의 정보 확인 

 

CREATE OR REPLACE

- 기존에 뷰가 있어도 덮어쓰는 효과를 내기 때문에 오류가 발생하지 않음

USE market_db;
CREATE OR REPLACE VIEW v_viewtest2
AS
    SELECT mem_id, mem_name, addr FROM member;

 

DESCRLBE

- 기존 뷰의 정보 확인 가능

- PRIMARY KEY등의 정보는 확인되지 않음

DESCRIBE v_viewtest2;

 

 

SHOW CREATE VIEW

- 뷰의 소스 코드 확인

 

 

4) 뷰를 통한 데이터의 수정/삭제 

 

- 뷰를 통해서 테이블의 데이터를 수정 가능

UPDATE v_member SET addr = '부산' WHERE mem_id = 'BLK';

 

-  지정한 범위로 뷰를 생성

 ex) 평균 키가 167 이상인 뷰 생성

CREATE VIEW v_height167
AS
	SELECT * FROM member WHERE hegiht >=167;
SELECT * FROM v_height167;

 

- v_height167 뷰에서 키가 167 미만인 데이터 삭제 (삭제될 데이터 없음)

DELETE FROM v_HEIGHT167 WHERE height < 167;

 

5) 뷰를 통한 데이터의 입력

 

WITH CHECK OPTION

- 뷰에 설정된 값의 범위가 벗어나는 값은 입력되지 않도록 할 수 있음

- 설정한 범위의 데이터만 입력되도록 제한

ALTER VIEW v_height167
AS
	SELECT * FROM member WHERE height >= 167
		WITH CHECK OPTION;
INSERT INTO v_height167 VALUES('TOB','텔레토비',4,'영국',NULL,NULL,140,'1995-01-01');

 - 167 미만인 데이터는 입력되지 않고, 167 이상의 데이터만 입력됨

 

 

6) 뷰가 참조하는 테이블의 삭제 

 

- 테이블은 뷰가 참조하고 있어도 삭제됨

 

CHECK TABLE

- 뷰의 상태 확인 가능