DB, SQL

MySQL VIEW

index.ys 2023. 10. 9. 21:26

뷰(VIEW)

  • 뷰는 데이터베이스 개체중 하나이다. 뷰는 한 번 생성해놓으면 테이블과 거의 동일한 개체로 취급
  • 뷰는 테이블 처럼 데이터를 가지고 있지 않음, SELECT문으로 만들어져 있기 때문에 뷰에 접속하는순간 SELECT문 실행되고 실행된 쿼리가 출력됨
  • 바탕화면의 바로가기 아이콘과 비슷한 개념
  • 가짜 테이블을 생성하여 중요한 정보는 조회하지 않고 필요한 정보만 조회하는 방식

뷰 생성하기

  • CREATE VIEW 문법으로 뷰를 생성하고 뷰의 별칭은 뷰라는 것을 파악하기 위해 별칭 앞에 v_별칭 같은 방식으로 뷰인 것을 구분함
  • AS뒤에 SELECT문으로 조회하려는 컬럼과 테이블을 지정해줌
CREATE VIEW v_user
AS
    SELECT user_id, name, phone FROM user;
  • 뷰를 사용한 조회와 실제 테이블에 접근한 조회는 같은 결과를 반환함
--실제 테이블에 접근하여 조회
SELECT user_id, name, phone FROM user;
--뷰를 활용해 조회
SELECT v_user

뷰의 작동

  • 뷰는 기본적으로 읽기 전용으로 사용되지만 뷰를통해서 원본 테이블의 데이터를 수정하는 것도 가능하다
  • 뷰를 통해 테이블을 수정하거나 데이터를 삽입하기 위해서는 제약조건 중 NOT NULL조건이나 , UNIQUE 조건등을 고려하여 삽입하거나 수정하려는 데이터가 중복되는지 혹은 비어있는지 확인한 후에 원본 테이블을 수정할 수 잇음

뷰를 사용하는 이유

보안

  • 뷰를 생성할 때 중요한 정보를 가진 컬럼은 뷰에 포함하지 않은 상태로 뷰를 생성하여 정보의 노출을 막을 수 있음
  • EX) 주민등록번호, 계좌 비밀번호 등
  • 데이터 베이스도 사용자마다 테이블에 접근하는 권한에 차별을 두어서 처리함

쿼리 추상화

  • 자주 사용하는 쿼리를 뷰로 생성하여 쿼리의 재사용성을 높힐 수 있음
  • 복잡한 쿼리를 추상화 하여 중복을 제거하고 재사용성을 높힘

복잡한 쿼리 예시

SELECT 
    customers.customer_id,
    customers.first_name,
    customers.last_name,
    orders.order_date
FROM 
    customers
JOIN 
    orders ON customers.customer_id = orders.customer_id
WHERE 
    orders.order_date >= '2023-01-01';

쿼리를 뷰로 생성

CREATE VIEW v_customer_orders AS
SELECT 
    customers.customer_id,
    customers.first_name,
    customers.last_name,
    orders.order_date
FROM 
    customers
JOIN 
    orders ON customers.customer_id = orders.customer_id
WHERE 
    orders.order_date >= '2023-01-01';

뷰 실행

SELECT * FROM v_customer_orders;

뷰 별칭

  • AS키워드로 컬럼 별칭 선언 AS는 생략가능
CREATE VIEW v_viewtest1
AS
-- 컬럼이름 뒤에 뷰의 별칭을 AS로 선언, AS는 생략가능
    SELECT B.mem_id AS '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키워드를 사용해 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 뷰이름;

뷰 정보 확인

  • CREATE OR REPLACE VIEW 구문은 생성하려는 뷰가 존재할떄 뷰를 삭제하고 다시 생성하는 키워드이다
  • DESC 혹은 DESCRIBE 키워드로 생성한 뷰의 정보를 조회가능
CREATE OR REPLACE VIEW v_view
AS
    SELECT user, name, phone FROM member;
  • 뷰에서는 PK등의 정보는 조회할 수 없음, 원본 테이블에서만 조회 가능
DESC v_user;
DESCRIBE v_user
  • SHOW CREATE VIEW구문으로 뷰의 소스코드 확인 가능
SHOW CREATE VIEW v_user;

뷰를 통한 데이터 변경

  • 뷰를 통해 데이터를 변경할 수 있지만 권장되는 방법은 아님
  • 원본 테이블에 걸려 있는 데이터의 제약조건을 맞추어야하고 데이터를 삽입했을때 뷰에 걸려있는 조건에 해당되지 않으면 데이터를 변경한 결과를 찾기가 번거로움
UPDATE v_user SET name = '강호동' WHERE id='15' ;
INSERT INTO v_user(id, name) VALUES('50','유재석') ;

제약 조건

  • WITH CHECK OPTION
  • 뷰를 생성하거나 수정할 떄 조건을 추가해 조건에 해당되는 데이터만 입력되도록 설정
  • 데이터가 입력될때 이름이 이수근이 아닌 데이터는 입력되지 않도록 설정
ALTER VIEW v_user
AS
    SELECT * FROM user WHERE name = '이수근'
        WITH CHECK OPTION ;

뷰 삭제

  • DROP VIEW로 삭제 할 수 있음
DROP VIEW 뷰이름
  • 뷰가 참조하는 원본 테이블이 삭제 되었을때 오류가 발생 => 뷰가 참조하는 원본테이블의 상테를 조회 하여 에러 확인
  • 뷰가 원본테이블을 참조하고 있어도 테이블은 삭제 가능
CHECK TABLE v_user