MySQL VIEWS

·2024년 4월 11일
0

MySQL

목록 보기
11/14
post-thumbnail

VIEWS

MySQL Views
Views are stored queries that when invoked produce a result set. A view acts as a virtual table.


"Views는 저장된 쿼리로 호출시에 결과 집합을 생성한다. Views는 가상 테이블의 역할을 한다."

요약 : 여기서 말하는 쿼리란 우리가 이름을 부여하고 저장하는 쿼리.

코드로 바로 확인해보자.

SELECT title, released_year, genre, rating, first_name FROM reviews
JOIN series ON series.id = reviews.series_id
JOIN reviewers ON reviewers.id = reviews.reviewer_id;

이 코드는 세 개의 테이블을 조인하여 모든 리뷰를 볼 수 있는 쿼리다.

매번 리뷰 데이터를 확인하고 싶을 때마다 길게 쿼리문을 작성해야할까?

아니다. CREATE VIEW를 사용하면 가상의 테이블을 만들어 손쉽게 접근가능하게 만들 수 있다.

CREATE VIEW full_reviews AS
SELECT title, released_year, genre, rating, first_name FROM reviews
JOIN series ON series.id = reviews.series_id
JOIN reviewers ON reviewers.id = reviews.reviewer_id;

가상 테이블 full_reviews가 생성되었다.

SELECT * FROM full_reviews;

VIEW로 생성한 가상 테이블로 데이터에 잘 접근되었다.

GROUP BY를 사용하여 특정 데이터만 볼 수도 있다.

SELECT genre, AVG(rating) FROM full_reviews GROUP BY genre;

VIEWS로 불가능한 것 🔥

VIEWS는 테이블처럼 보이지만, 테이블이 아니다.
따라서 VIEWS로 모든 테이블 작업을 할 수 있는 것은 아니다.

대표적으로 데이터 삭제가 되지 않는다.

DELETE FROM full_reviews WHERE released_year = 2010;

출력 에러 :
Can not delete from join view 'tv_db.full_reviews'
조인된 뷰인 tv_db.full_reviews에서 삭제할 수 없다.

업데이트 할 수 있는 VIEWS는 굉장히 제한적인데, 일단 제한되는 VIEWS의 조건은 아래와 같다.

  1. SUM, MIN, MAX 등의 집계 함수가 포함된 VIEWS업데이트, 삭제, 삽입이 불가능하다.
  2. 서브쿼리, 그룹화, 특정 조인이 적용된 경우

위 조건에 해당하지 않는다면 VIEW 업데이트가 가능하다.

-- 업데이트 가능한 view
-- 위 조건에 해당하지 않는 view를 만든다면 업데이트가 가능함.

-- 데이터 추가
INSERT INTO ordered_series(title, released_year, genre)
VALUES('The Great', 2020, 'Comedy');


-- 데이터 삭제
DELETE FROM ordered_series WHERE title = 'The Great';

View로 실행하는 쿼리 자체를 수정

생성한 View를 수정하고 싶은 상황이 있을 수 있다.
예컨대 정렬을 변경한다거나..

1️⃣. CREATE OR REPLACE

-- 최초 View 생성

CREATE VIEW ordered_series AS
SELECT * FROM series ORDER BY released_year;

이렇게 생성한 View를 수정하려면 CREATE 뒤에
OR REPLACE를 붙혀주면 된다.

-- 최초 생성 View 수정

CREATE OR REPLACE VIEW ordered_series AS
SELECT * FROM series ORDER BY released_year DESC;

CREATE OR REPLACE
즉, 말 그대로 없으면 이대로 생성해라. 근데 있으면 이 쿼리로 새로 만들어라.

2️⃣. ALTER VIEW

ALTER VIEW ordered_series AS
SELECT * FROM series ORDER BY released_year;

이것을 사용해도 View를 수정할 수 있다.

View 삭제

DROP VIEW ordered_series;

View는 삭제되었지만, 기존 데이터는 삭제되지 않았음을 명심하자.

profile
- 배움에는 끝이 없다.

0개의 댓글