[SQL 독학] 가상의 테이블 : 뷰(생성, 수정, 삭제)

2022. 7. 19. 07:44SQL

뷰 (View)

데이터베이스 개체 중 하나로 '가상의

테이블'이라고 생각하면 된다. 한 번 생성해

놓으면 테이블이라고 생각하고 사용해도 될

정도로 사용자의 입장에서 테이블과 거의

동일한 개체로 취급하기도 한다. 가장 잘

와닿는 비유로는 바로가기 아이콘이다.

 

뷰는 단순 뷰복합 뷰로 나뉘는데

단순 뷰는 하나의 테이블과 연관된 뷰를

말하고, 복합 뷰는 2개 이상의 테이블과

연관된 뷰를 말한다.

 

 

뷰의 기본 생성

USE market_db;
SELECT man_id, man_name, man_addr FROM memebers;

위와 같이 USE로 DB에 접속한 후

SELECT문을 입력하면 요청한 항목에

대한 output 테이블 형태로 나올 것이다.

그래서 가상의 '테이블'이라고 하는 것이고,

이 SELECT문이 뷰의 실체다.

 

기본 형식

CREATE VIEW 뷰_이름
AS
    SELECT 문;

접근하는 방식 : 조건식 사용 가능

SELECT 열_이름 FROM 뷰_이름
    [WHERE 조건];

출처 : 한빛미디어 - 혼자 공부하는 SQL

그럼 뭐하고 굳이 뷰를

따로 두고 사용하나 싶긴한데

다음과 같은 이유들이 있다.

① 보안(security)에 도움이 된다.

② 복잡한 SQL을 단순하게 만들 수 있다.

 

 

뷰 갱신 (생성, 수정, 삭제)

뷰 정의 SELECT 문이 몇 가지 조건을

만족하는 경우에 뷰 갱신이 가능하다.

- SELECT 구에 DISTINCT가 포함 X

- FROM 구에 포함되는 테이블이 하나

- GROUP BY 구를 사용하고 있지 X

- HAVING 구를 사용 X

- 집약된 뷰는 갱신이 불가능하다.

 

뷰를 생성할 때 지정해주는 별칭엔

띄어쓰기가 포함되어도 되나 열 이름

뒤에 ' 또는 "로 묶어주고, 형식상 AS를

붙여줘야 한다. 그리고 반대로 조회할 때

열 이름에 공백이 있으면 `(백틱)으로

묶어줘야 한다. (아래 예시 참고)

# view 생성
USE market_db;
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 membr M
        ON B.mem_id = M.mem_id;
        
# view 조회
SELECT DISTINCT `Member ID`, `Member Name` FROM v_viewtest1;

# view 삭제
DROP VIEW v_viewtest1;

이 외에도 기존에 존재하던 View를

조회하거나 수정하는 것도 가능하다.

-- 기존 view 정보 확인
DESCRIVE v_viewtest2;

-- view를 만든 구문을 확인하고 싶을 때
SHOW CREATE VIEW v_viewtest2;

-- view 수정
UPDATE v_member SET addr = '부산' WHERE mem_id = 'BLK';

-- view로 데이터 입력 (권장X)
---- 단, NOT NILL 요소는 다 넣어주던가 요소의 NO NULL을 풀어주던가 해야함.(복잡해짐)
INSERT INTO v_member(mem_id, mem_name, addr) VALUES('BTS', '방탄소년단', '경기');    #---> NN값인 인원수가 입력되지 않았기 때문에 입력 안됨.

-- 좀 더 나은 버전 : view의 조건에 안 맞는 것은 입력되지 않도록(WITH CHECK OPTION).
ALTER VIEW v_hight167
AS
	SELECT * FROM member WHERE height >= 167
    	WITH CHECK OPTION:
INSERT INTO v_height167 VALUES('TOB', '텔레토비', 4, '영국', NULL, NULL, 140, …)

뷰가 테이블을 참조하고 있어도 테이블은

삭제가 가능하다. 그렇게 되면 당연히 뷰도

다시 불러올 수 없으므로 주의하자.

 

그리고 마지막으로 만약 뷰가

왜 조회 안되는지 궁금할 때는

CHECK TABLE 뷰이름;

을 통해 확인할 수 있다.

 

 

++ 추가

! 뷰 위에 뷰를 겹치는 것도 가능하나

가능한 겹쳐서 사용하지 않는다.

! 뷰 정의에는 ORDER BY 구를 사용하지 않는다.

 

 

The End.