
테이블 View
DevCho1107
·2023. 5. 9. 01:58
MySql Workbench 설치하니까 기본으로 sakila 라는 DVD 대여점의 데이터베이스가 예제로 제공되었다.
보니까 View 가 있던데, Table 을 기반으로 한 개념이다. 뷰는 실제 데이터가 저장되어 있는 테이블의 일부 데이터를 가지고 있는 가상 테이블이다.
특정 테이블의 특정 열만을 선택해서 보여주거나, 두 개 이상의 테이블에서 테이터를 조합해 보여줄 수 있다.
뷰는 이미 존재하는 테이블을 기반으로 만드는거니까, 해당 뷰만의 인덱스를 가질 수 없다.
그리고 당연히 기반 테이블 업데이트 시 뷰도 같이 업데이트 된다.
아래는 뷰 생성방법이다.
CREATE VIEW [뷰 이름] AS
SELECT [컬럼1], [컬럼2], ...
FROM [테이블1]
WHERE [조건];
아래는 Mysql 에서 제공되는 예제로 만들어진 테이블과 뷰이다.
CREATE
ALGORITHM = UNDEFINED
DEFINER = `root`@`localhost`
SQL SECURITY INVOKER
VIEW `sakila`.`actor_info` AS
SELECT
`a`.`actor_id` AS `actor_id`,
`a`.`first_name` AS `first_name`,
`a`.`last_name` AS `last_name`,
GROUP_CONCAT(DISTINCT CONCAT(`c`.`name`,
': ',
(SELECT
GROUP_CONCAT(`f`.`title`
ORDER BY `f`.`title` ASC
SEPARATOR ', ')
FROM
((`sakila`.`film` `f`
JOIN `sakila`.`film_category` `fc` ON ((`f`.`film_id` = `fc`.`film_id`)))
JOIN `sakila`.`film_actor` `fa` ON ((`f`.`film_id` = `fa`.`film_id`)))
WHERE
((`fc`.`category_id` = `c`.`category_id`)
AND (`fa`.`actor_id` = `a`.`actor_id`))))
ORDER BY `c`.`name` ASC
SEPARATOR '; ') AS `film_info`
FROM
(((`sakila`.`actor` `a`
LEFT JOIN `sakila`.`film_actor` `fa` ON ((`a`.`actor_id` = `fa`.`actor_id`)))
LEFT JOIN `sakila`.`film_category` `fc` ON ((`fa`.`film_id` = `fc`.`film_id`)))
LEFT JOIN `sakila`.`category` `c` ON ((`fc`.`category_id` = `c`.`category_id`)))
GROUP BY `a`.`actor_id` , `a`.`first_name` , `a`.`last_name`
1. actor 테이블과 film_actor 를 actor_id 열 기준으로 left join
-> actor_id 가 같은 각 배우와 출현한 영화들이 조인 됨

1-2. 1-1의 결과와 film_category 를 film_id 를 기준으로 left join
-> 각 배우가 출현한 영화들과 그 영화들이 속한 카테고리가 조인 됨

1. 1-2의 결과와 category 테이블을 category_id 열 기준으로 left join
-> 각 배우가 출현한 영화들의 카테고리와 실제 카테고리 이름이 조인 됨

이렇게 종합된 데이터들을 GROUP_CONCAT 함수와 CONCAT 함수를 통해서 film_info 라는 문자열 데이터로 종합하고,
GROUP BY 를 통해서 정리한 뒤 보여주는 View 라고 할 수 있다.