본문 바로가기

SQL

가상의 테이블: 뷰(생성, 수정, 삭제)

《 뷰(VIEW) 》

 

데이터베이스 개체

가상의 테이블, 실체가 없음

바로가기 아이콘과 유사

 

 

《 VIEW의 프레임 》

 

CREATE VIEW < 뷰이름 >
AS
    SELECT문;

 


 

《 VIEW를 사용하는 이유? 》

 

1) 보안에 도움이 된다(내가 보여주고 싶은 정보만 빼내서 보여줄 수 있다)
2) 쿼리를 단순하게 만들 수 있다

 

 

# 보안에 관한 내용 살펴보기

 

< Customer >

 

NUM NAME ID PASSWORD GRADE
1 Sole remio ********* Gold

· NUM : 고객번호

· NAME : 고객이름

· ID : 고객 ID

· PASSWORD : 고객 비밀번호

· GRADE : 회사에서 구매횟수에 따라 매긴 고객등급

 

Customer테이블은 회사가 고객의 모든 정보를 저장해두고 있는 테이블이다.

회사에서는 테이블의 구성을 바꾸지 않고 고객이 GRADE를 제외한 나머지 정보만 조회할 수 있도록 하고싶다.

VIEW는 GRADE를 제외한 아래와 같은 정보를 고객에게 제공할 수 있다.

 

NUM NAME ID PASSWORD
1 Sole remio *********

 

 

 

# 쿼리 단순화 살펴보기

 

· VIEW를 생성하지 않고 데이터를 가져올 때

SELECT B.mem_id, M.mem_name, B.prod_name, M.addr, CONCAT(M.phone1, M.phone2) '연락처'
    FROM buy B
    INNER JOIN member M
        ON B.mem_id = M.mem_id;

 

 

· VEIW를 생성하고 데이터를 가져올 때

CREATE VIEW v_memberbuy
AS
    SELECT B.mem_id, M.mem_name, B.prod_name, M.addr, CONCAT(M.phone1, M.phone2) '연락처'
    FROM buy B
    INNER JOIN member M
        ON B.mem_id = M.mem_id;    # 뷰 생성
----------------------------------------------------------------------------------------------------------------------------------------------

SELECT
* FROM v_memberbuy
WHERE mem_name = '블랙핑크' ;

 

데이터를 한 번만 가져온다고 하면 VIEW를 생성하지 않는 게 편해보일지 모르지만, 2개 이상의 데이터를 복잡한 쿼리문을 사용해서 가져올 때는 VIEW를 생성하고 가져오는 것이 훨씬 편리하다.

 


 

🤔 뷰에서 사용될 컬럼명을 다르게 지정하고 싶다면?

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;

백틱(`)을 사용해야 한다.

 

 

 DESCRIBE 》

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

생성한 VIEW를 확인 가능

 

 

 

《 VIEW의 수정, 삭제, 삽입 》

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

기입해야할 데이터와 그 자료형만 제대로 맞춘다면 view에는 수정, 삭제과 삽입이 가능하다.

수정과 삭제는 UPDATE문을 DELETE, INSERT문으로만 수정하면 되기 때문에 수정한다.

 

※ VIEW에서 실제 TABLE로의 접근은 불가능하다는 것을 알아두자

 

 

 

기준이 되는 테이블을 삭제하면?

DROP TABLE IF EXISTS buy, member;
SELECT * FROM v_height167;

view와 관계없이 table은 지울 수 있다.

 

 

check table을 사용해서 왜 view가 조회가 안되는지 확인할 수 있다.

CHECK TABLE v_height167;

 

· 실행결과

0  row(s) affected

Error Code : 1356 View 'market_db.v_height167' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them