[목차]
- 뷰 테이블이란?
- 가상테이블이란
- 뷰 테이블의 데이터 동기화?
- 뷰 테이블 생성 및 조회 시 동작 과정
- 뷰테이블 쓰는 이유 및 뷰테이블 성능
- 복합 뷰 테이블 (view table join)
- 뷰 테이블 장, 단점
- 뷰테이블 유용하게 사용될 떄
1. SQL View Table 이란
- 📌 뷰(View)란 데이터베이스에 존재하는 일종의 가상테이블입니다.
- 가상 테이블이란 이름 그대로 실제 데이터를 가지고 있지않은 테이블 의미합니다.
- 뷰 테이블은 데이터가 아닌, SQL 을 저장하고 있으며
- 그렇기때문에, 이름 그대로 View, 즉 데이터를 보여주기만하는 테이블이다. 로 이해할 수 있을 것 같습니다.
VIEW와 TABLE과의 차이점은 그냥 TABLE은 실질적인 데이터가 있지만 VIEW는 데이터가 없고 SQL만 저장한다. 입니다
💡 즉, 뷰 테이블이란, 실제 데이터를 저장하고 있지 않고 SQL 을 저장하고 있는, 보여주는 것 만을 목적으로하는 테이블입니다.
2. 가상테이블이란
- 이름 그대로입니다. 실제로 존재하지않는 테이블입니다.
❓ 그럼 왜 굳이 실제가 없는데 테이블이라고 정의를 할까요?
- ➡️ View 의 사용 목적이, 복잡한 쿼리문을 계속 계속 조회할거라면, 차라리 테이블처럼 관리하는게 편하겠다~ 이기 때문입니다.
즉, 뷰의 사용 목적은
- 복잡한 쿼리문의 간소화, 중복 발생하는 쿼리문의 관리라고 볼 수 있습니다.
- 보여주는 컬럼의 제한 (보안성) 또한 추가적인 목적이라고 할 수 있습니다,
3. View Table 데이터 최신화?
view 를 자세히 알기 전에, " 기존 테이블이 업데이트되면 뷰 테이블도 업데이트가 될까? " 하는 의문이 있었습니다.
--> 업데이트가 되는 것 같은데 왜 되지??? 가상테이블인데????? 미리 만들어진 미리보기 결과인데????
이제 뷰를 알고 난 후에는,
뷰를 조회할 때마다, 옵티마이저에서 뷰를 생성할 때, 저장해 놓은 Select 문이 날라가는 것이기 때문에 당연히, 사용자가 바로보는 가상 테이블의 데이터 또한 업데이트 되는 것이였습니당...ㅎㅎ
💡Table 과 가상 테이블의 속도 차이
사용하는 방법과 의도에 따라 다를 것 같습니다.
하지만, 근본적으로 뷰를 조회하 때 마다 똑같은 쿼리문이 날라가는 것이기 때문에 View 의 성능이라는 말이 맞지 않는다는 생각이 들었습니다.
- sql 만 저장하는거라서 그냥 쿼리문 날리는거랑 속도차이가 나지 않는다는 말입니다!
4. 뷰 테이블 생성 및 조회 시 동작 과정
이제 MySql 에서 View 사용법을 정리해보겠습니다!
뷰의 종류는 단순뷰 와 복합뷰로 나눌 수 있는데, 저는 복합뷰로 사용을 해보았습니다.
💡 단순 뷰 vs 복합 뷰
단순 뷰 (Single View)
- 하나의 테이블로 생성
- 그륩 함수의 사용이 불가능
- Distinct 사용이 불가능
- DML 사용이 가능
복합 뷰( Complex View)
- 여러개의 테이블로 생성 (join)
- 그륩 함수의 사용이 가능
- Distinct 사용이 가능
- DML 사용이 불가능
1. view table 생성하기 (복합 뷰)
원래 사용할려는 복잡한 Join 문 (안복잡한데 복잡하다고 해주세요)
select *
from A_db.photo e inner join B_db.user u on e.user_idx = u.idx;
Create View
Create View My_View AS
select *
from A_db.photo e
inner join B_db.user u
on e.user_idx = u.idx;
사실은 조인할 때, 중복된 컬럼 이름이 존재하면 안되서 별칭(AS) 를 사용하거나, 중복된 컬럼을 제거해주어야합니다.
ex) 예시
CREATE VIEW MyView AS
SELECT Name, ReserveDate, ReserveDate - Curdate() AS Dday
FROM Reservation;
Mysql View Create 공식 문법
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]
2. 뷰 조회
📌 View 를 조회하면, select * from view_table_name 이 날라가지만, 실제로 아래의 sql 문이 저장되었다가 필요할 때 마다 날라가서 조회가 되는 것입니다.
3. 뷰 수정 및 삭제
CREATE 문을 사용하여 생성된 뷰는 ALTER 문을 사용하여 수정할 수 있습니다.
ALTER VIEW 뷰이름 AS
SELECT 필드이름1, 필드이름2, ...
FROM 테이블이름
DROP 문을 사용하여 생성된 뷰를 삭제할 수 있습니다.
DROP VIEW MyView;
4. 뷰 특징
- 뷰 update가 가능은 하지만 많은 제약조건이 존재합니다.
- 뷰를 insert하는 것은 조건이 있습니 다.
테이블의 모든 필드의 값을 넣어줘야하는데 일부만 넣어주게 되면 불가능. 그래서 넣으려면 전체를 다 넣거나 디폴트를 지정해줍니다. - 집계함수가 들어가는 뷰는 수정이 불가능합니다.
- 자신만의 인덱스를 가질 수 없습니다. (뷰는 가상테이블이기 때문에, 바라보는 테이블의 인덱스를 가져가갑니다.)
5. Spring 에서의 View 사용하기
그냥 테이블을 사용할 때 와 똑같이 @Entity를 사용하면 됩니다.
다만, View Table이기에 조금 더 명확하고 명시적으로 데이터를 변경하지 않게다는 것을 위해 @Immutable 어노테이션을 사용하면 좋을 것 같습니다.
참고
View 문법 예시 : http://www.tcpschool.com/mysql/mysql_view_createReplace
MySql Docs : https://dev.mysql.com/doc/refman/8.0/en/create-view.html
View 조회 : https://stricky.tistory.com/323
'DataBase > Mysql' 카테고리의 다른 글
Mysql 성능 조회 - Explain 실행 계획으로 쿼리 성능 최적화하기 (0) | 2022.08.11 |
---|---|
[MySql] mysql 다중 문자열 치환 - Replace & case 쿼리 (0) | 2022.07.21 |
MySql orderBy null first /null last 정렬 (0) | 2022.07.05 |
[SQL] 서브쿼리문, Subquery 사용하기 (0) | 2022.01.06 |
[SQL] 테이블 연결 , Join 과 Union (0) | 2022.01.06 |