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로 모든 테이블 작업을 할 수 있는 것은 아니다.
대표적으로 데이터 삭제가 되지 않는다.
DELETE FROM full_reviews WHERE released_year = 2010;
출력 에러 :
Can not delete from join view 'tv_db.full_reviews'
조인된 뷰인 tv_db.full_reviews에서 삭제할 수 없다.
업데이트 할 수 있는 VIEWS는 굉장히 제한적인데, 일단 제한되는 VIEWS의 조건은 아래와 같다.
SUM, MIN, MAX 등의 집계 함수가 포함된 VIEWS는 업데이트, 삭제, 삽입이 불가능하다.서브쿼리, 그룹화, 특정 조인이 적용된 경우위 조건에 해당하지 않는다면 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를 수정하고 싶은 상황이 있을 수 있다.
예컨대 정렬을 변경한다거나..
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를 수정할 수 있다.
DROP VIEW ordered_series;
View는 삭제되었지만, 기존 데이터는 삭제되지 않았음을 명심하자.