뷰(view)는 관계 데이터베이스의 데이터베이스 언어 SQL에서 하나 이상의 테이블 (또는 다른 뷰)에서 원하는 모든 데이터를 선택하여, 그들을 사용자 정의하여 나타낸 것
위키 피디아에서 위와 같이 뷰 테이블을 선택합니다. 스터디를 같이한 분의 비유로는 단축키 개념으로 이해하면 편하다고 하였습니다.
CREATE
[OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = user]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
위 문법은 MySQL의 공식 문서에서 가져왔습니다.
복잡한 것을 싹 지우고 간단하게 축약하면 아래와 같은 간단한 모양을 볼 수 있습니다.
CREATE VIEW 뷰이름 AS SELECT 구문;
SELECT 구문을 사용하여 View테이블에 담길 정보를 미리 지정합니다.
DROP VIEW 뷰이름;
기존 테이블을 삭제하는 것과 같은 문법을 가지고 있습니다.
SELECT [칼럼들] FROM 뷰이름;
mysql> CREATE TABLE t (qty INT, price INT);
mysql> INSERT INTO t VALUES(3, 50);
mysql> CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t;
mysql> SELECT * FROM v;
+------+-------+-------+
| qty | price | value |
+------+-------+-------+
| 3 | 50 | 150 |
+------+-------+-------+
CREATE로 생성하고 기존 테이블을 사용하는 방법과 같이 SELECT ??? FROM 뷰이름을 넣으면 됩니다.
뷰 테이블을 사용하는 쿼리가 들어왔을 때 뷰 테이블의 쿼리를 실행하고 해당 테이블을 바탕으로 SELECT문을 실행합니다. 메모리 / 하드 디스크에 추가적인 저장은 하지 않습니다.
사용 이유에는 크게 5가지 이유가 존재합니다.
뷰 테이블은 기본적으로 데이터 수정, 삭제, 생성이 실제 테이블에 적용이 되지 않으며 불가능합니다. 하지만 읽기 전용 뷰 테이블이 아닌 수정이 가능한 뷰 테이블이 존재하는데 다음과 같은 조건이 갖추어져야 합니다.
SUM(), MIN(), MAX(), COUNT() 등.DISTINCT 사용 시GROUP BY 사용 시HAVING 사용 시UNION 또는 UNION ALL 사용 시INSERT는 실패하지만 UPDATE, DELETE는 가능.ALGORITHM = TEMPTABLE 로 생성한 뷰INSERT는 실패, UPDATE/DELETE는 가능.위 조건은 SQL 공식 문서에 기재된 내용입니다. 위 내용을 확인해보면 실제 데이터와 1:1 매핑이 되는지 확인하고 매핑이 안되거나 추가적인 연산이 생겼다면 데이터 수정이 안되는 것으로 확인할 수 있습니다.
스터디를 시작하기 전에 뷰 테이블에 대한 관점을 캐시와 유사하다라고 생각했습니다. 하지만 스터디를 진행하면서 잘못된 생각임을 깨닫게 되어 자료를 추가로 찾아보던 중 Materialized View이라는 뷰 테이블을 발견하였습니다.
쿼리의 결과를 담고 있는 데이터베이스 오브젝트라고 위키피디아에서 말하고 있습니다.
한글로 구체화된 뷰로 쿼리의 결과를 저장하고 호출 시 해당 쿼리의 결과를 제공합니다. 특정 주기마다 업데이트를 진행하거나 사용자가 원할 때 뷰 테이블을 업데이트 합니다.
CREATE MATERIALIZED VIEW sales_summary AS
SELECT region, SUM(sales) AS total_sales
FROM orders
GROUP BY region;
기본적으로 뷰 테이블 문법에서 앞에 MATERIALIZED 키워드를 넣어주면 완성됩니다.
REFRESH MATERIALIZED VIEW sales_summary;
REFRESH문법을 사용하여 데이터 업데이트를 진행할 수 있습니다.