즐겁게 배우는 SQL 10. 뷰

jiffydev·2021년 7월 12일
0

즐겁게 배우는 SQL

목록 보기
10/13

본 포스트는 박재호님의 유튜브 강의(링크)를 보고 일부 발췌하여 정리한 내용입니다.
사용된 자료, 샘플 데이터 등은 모두 SQLite Tutorial에서 확인할 수 있습니다.

1. 뷰란?

뷰의 정의는 '저장된 쿼리의 결과물'이다.
조금 더 풀어서 설명하면 쿼리를 데이터베이스 안에 이름이 붙은 객체로 취급한다는 뜻이다.
예를 들어 엄청나게 긴 쿼리문을 사용해야 할 때, 이 쿼리문을 매번 타이핑하거나 메모장같은 곳에 저장해 놓고 복붙한다면 매우 귀찮을 것이다.
이를 해결하기 위해 쿼리문을 저장해 놓고 이를 불러와서 다시 사용할 수 있도록 한 것이 뷰이다.

또한 뷰는 그 자체로 하나의 테이블처럼 취급되기 때문에 원하는 데이터의 원본은 그대로 두고 자유롭게 컬럼을 추가/삭제가 가능하므로 운영, 관리 측면에서도 편리하다.

한 가지 주의할 점은 뷰는 읽기 전용이기 때문에 CRUD 중 R만 사용 가능하므로, 데이터 자체를 조작할 수는 없다.

뷰를 생성하는 sql문은 다음과 같다.

CREATE [TEMP] VIEW [IF NOT EXISTS] view_name[(column-name-list)]
AS 
   select-statement;

TEMP는 활성화하게 되면 현재 DB가 열린 세션에서만 볼 수 있고, 세션을 끝내면 데이터도 사라진다.
AS 이후에 일반적인 select 쿼리문을 작성하면 된다.

SELECT
   trackid,
   tracks.name,
   albums.Title AS album,
   media_types.Name AS media,
   genres.Name AS genres
FROM
   tracks
INNER JOIN albums ON Albums.AlbumId = tracks.AlbumId
INNER JOIN media_types ON media_types.MediaTypeId = tracks.MediaTypeId
INNER JOIN genres ON genres.GenreId = tracks.GenreId;

이 sql문을 가지고 뷰를 생성해 보자.

CREATE VIEW v_tracks
AS
SELECT
   trackid,
   tracks.name,
   albums.Title AS album,
   media_types.Name AS media,
   genres.Name AS genres
FROM
   tracks
INNER JOIN albums ON Albums.AlbumId = tracks.AlbumId
INNER JOIN media_types ON media_types.MediaTypeId = tracks.MediaTypeId
INNER JOIN genres ON genres.GenreId = tracks.GenreId;

뷰가 생성되었고, 테이블에서 쿼리하듯이 뷰인 v_tracks에서도 select문을 사용해 데이터를 쿼리할 수 있을 것이다.

이번에는 새로운 컬럼이 추가된 뷰를 생성해 볼 것이다.

CREATE VIEW v_albums (
    AlbumTitle,
    Minutes
)
AS
    SELECT albums.title,
           SUM(milliseconds) / 60000
      FROM tracks
           INNER JOIN
           albums USING (
               AlbumId
           )
     GROUP BY albums.title;

sqlite의 경우, 어떤 뷰를 만들었는지 목록을 보고 싶다면 아래 sql문을 사용하면 된다.

SELECT name from sqlite_master 
  WHERE type ='view'

2. 뷰 제거

테이블을 제거하는 것이 간단한 것처럼, 뷰를 제거하는 것도 간단하다.

DROP VIEW [IF EXISTS] [schema_name.]view_name;
profile
잘 & 열심히 살고싶은 개발자

0개의 댓글