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
는 삭제되었지만, 기존 데이터는 삭제되지 않았음을 명심하자.