테이블 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 라고 할 수 있다.