Language/SQL

[MySQL] 가상의 테이블인 뷰(View)에 대해 알아보자

seoraroong 2024. 8. 21. 11:23

뷰 (View)

테이블과 밀접하게 연관되어 있는 데이터베이스 개체이다.

테이블처럼 데이터를 가지고 있지는 않다.

 

단순 뷰, 복합 뷰 로 구분된다.

 

 

뷰 (View) 의 기본 생성

- 뷰를 만드는 형식

CREATE VIEW 뷰_이름
AS
   SELECT 문;

 

- 뷰에 접근하는 방식

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

 

- 회원 테이블의 아이디, 이름, 주소에 접근하는 뷰 생성, 접근하기

// 뷰 생성
USE market_db;
CREATE VIEW v_member
AS
    SELECT mem_id, mem_name, addr FROM member;
    
// 뷰 접근
SELECT * FROM v_member;

 

뷰의 실체는 SELECT 문이다

 

 

 

뷰를 사용하는 이유

 

📌 보안(security)에 도움이 된다

기본적인 정보만 보이는 뷰를 생성해서 권한이 없을 경우 테이블에 접근하지 못하도록 한다.

 

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

자주 사용하는 쿼리를 뷰로 만들면 매번 복잡한 SQL을 입력할 필요가 없다.

 

 

 

 

뷰의 실제 생성, 수정, 삭제

뷰를 생성할 때 **별칭(Alias)**을 사용해 뷰의 열 이름을 테이블과 다르게 지정할 수 있다.

 

뷰 조회 시 열 이름에 공백이 있으면 백틱(`)으로 묶어준다.

 

- 뷰 생성

CREATE 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 member M
                 ON B.mem_id = M.mem_id;
SELECT DISTINCT `Member ID`, `Member Name` FROM v_viewtest1;

 

 

- 뷰 수정

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;

 

 

- 뷰 삭제

DROP VIEW 뷰_이름
DROP VIEW v_viewtest1;

 

 

 

 

뷰의 정보 확인하기

 

- 뷰의 정보 확인

DESCRIBE 뷰_이름 ( = DESC 뷰_이름)
// 테스트용 뷰 생성하기

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

// 뷰 정보 확인하기

DESCRIBE v_viewtest2;

→ DESCRIBE로 뷰의 키 정보는 확인할 수 없다 (테이블은 가능)

 

 

- 뷰의 소스코드 확인

SHOW CREATE VIEW 뷰_이름
SHOW CREATE VIEW v_viewtest2;

 

 

 

 

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

 

- 뷰를 통한 데이터 수정

UPDATE 뷰_이름 SET 수정 내용
UPDATE v_member SET addr = '부산' WHERE mem_id = 'BLK';

 

 

- 뷰에 데이터 입력

INSERT INTO 뷰_이름(열_이름) VALUES(입력할 데이터)
INSERT INTO v_member(mem_id, mem_name, addr) VALUES('BTS', '방탄소년단', '경기');

-> 뷰를 통해 데이터를 입력하려면, 뷰에서 보이지 않는 테이블의 열에 NOT NULL이 없어야 한다.\

 

 

- 뷰를 통한 데이터 삭제

DELETE FROM 뷰_이름 WHERE 조건
// 테스트용 뷰 생성

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

SELECT * FROM v_height167;

// 키가 167 미만인 데이터 삭제

DELETE FROM v_height167 WHERE height < 167;

-> 키가 167 미만인 데이터가 없어서 삭제되는 행이 없다.

 

 

- 뷰를 통한 데이터의 입력 : 키가 167 미만인 데이터 입력

INSERT INTO v_height167 VALUES('TRA', '티아라', 6, '서울', NULL, NULL, 159, '2005-01-01');
SELECT * FROM v_height167;

-> 키가 167 이상인 데이터만 보이도록 만든 뷰이므로, 입력한 데이터는 보이지 않는다.

 

 

- 뷰에 설정된 값의 범위에서 벗어나는 값은 입력되지 않게 하기 -> 예약어 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 미만의 데이터이기 때문에 입력되지 않는다.

 

 

 

단순 뷰와 복합 뷰

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

복합 뷰 : 두 개 이상의 테이블로 만든 뷰, 읽기 전용으로 데이터 입력/수정/삭제 불가능

 

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

뷰가 참조하고 있더라도 테이블은 삭제된다.

뷰가 조회되지 않으면 CHECK TABLE 문으로 뷰의 상태를 확인한다.