SQLite | 뷰(View) | 뷰(View) 생성

SQLite에는 뷰(View)라는 기능이 포함되어 있다. 뷰는 생성된 테이블의 컬럼과 데이터 검색 조건을 지정하여 만든 가상적인 테이블이다. 여기에서는 뷰 생성 및 이용 방법에 대해 설명한다.

뷰 생성

뷰를 만들려면 다음 형식을 사용한다.

CREATE VIEW 뷰명 AS SELECT ;

AS를 작성하고 SELECT 문을 사용하여 기존의 테이블에 있는 컬럼과 조건 등을 지정한다. 예를 들면 다음과 같다.

create view myview as select name, price from product where price> 3000;

이렇게 뷰는 테이블에서 일부만을 추출하여 마치 다른 테이블인거처럼 사용 할 수 있도록 해준다. 나중에 설명하지만, 뷰에서 테이블처럼 데이터를 검색 할 수 있지만 뷰를 사용하여 데이터를 업데이트하거나 추가 할 수 없다.

그럼 실제로 뷰를 만들어 보자. 우선 원본이 되는 테이블을 다음과 같이 작성한다.

create table user (id integer, name text, address text, old integer);
sqlite> create table user (id integer, name text, address text, old integer);
sqlite> 

테이블에 데이터를 추가한다.

insert into user values (1, 'devkuma', 'Seoul', 23);
insert into user values (2, 'kimkc', 'Busan', 19);
insert into user values (3, 'araikuma', 'Seoul', 38);
insert into user values (4, 'happykuma', 'Seoul', 24);
insert into user values (5, 'mykuma', 'Daejeon', 18);
sqlite> insert into user values (1, 'devkuma', 'Seoul', 23);
sqlite> insert into user values (2, 'kimkc', 'Busan', 19);
sqlite> insert into user values (3, 'araikuma', 'Seoul', 38);
sqlite> insert into user values (4, 'happykuma', 'Seoul', 24);
sqlite> insert into user values (5, 'mykuma', 'Daejeon', 18);
sqlite> 

그럼 이 테이블을 바탕으로 뷰를 생성해 보자. 여기서는 seouluser라는 뷰를 생성한다.

create view seouluser as select id, name from user where address = 'Seoul';
sqlite> create view seouluser as select id, name from user where address = 'Seoul';
sqlite>

생성한 뷰는 user 테이블의 id와 name 컬럼을 가지고 있고, 데이터로 user 테이블의 address 컬럼의 값이 ‘Seoul’과 일치하는 데이터만 가지고 있다. (나중에 설명하겠지만 실제로는 데이터를 가지고 있는 것은 아니다.)

그러면 작성한 뷰에서 데이터를 검색해 보자.

select * from tokyouser;
sqlite> select * from seouluser;
1|devkuma
3|araikuma
4|happykuma

테이블과 동일하게 뷰에서 데이터를 조회되는 것을 볼 수 있다. 즉, 뷰에서 조회하는 데이터와 뷰의 원본이 되고 있는 테이블에서 다음과 같이 데이터를 조회하는 경우와 동일하다.

select id, name from user where address = 'Tokyo';
sqlite> select id, name from user where address = 'Seoul';
1|devkuma
3|araikuma
4|happykuma
sqlite> 

뷰를 만들면하여 테이블에서 필요한 데이터를 쉽게 간단히 조회할 수 있다.

뷰에서 얻을 수 있는 데이터에 대해

뷰는 어떤 데이터를 원래의 테이블에서 검색하는지에 대한 정의를 하고 있을 뿐 데이터 자체는 가지고 있지 않다. 뷰에서 데이터를 검색할 때마다 현재 테이블의 데이터에서 조건에 맞는 데이터를 가져 온다. 그러므로 뷰에 대해 동일한 SQL 문을 실행해도 원래 테이블의 데이터가 바뀐 경우 다른 결과가 될 가능성이 있다.

실제로 해보도록 하자. 현재 원본이 되는 테이블에 다음과 같은 데이터가 포함되어 있다.

select * from user;
sqlite> select * from user;
1|devkuma|Seoul|23
2|kimkc|Busan|19
3|araikuma|Seoul|38
4|happykuma|Seoul|24
5|mykuma|Daejeon|18

생성된 뷰에서 데이터를 가져온다.

select * from seouluser;
sqlite> select * from seouluser;
1|devkuma
3|araikuma
4|happykuma

그러면 뷰의 원본이 되는 테이블에 데이터를 추가한 후에 다시 뷰에 데이터를 조회하려고 한다. 그러면 뷰에서 조회되는 데이터가 같이 추가되는 것을 볼 수 있다.

insert into user values (6, 'yourkuma', ' Seoul', 17);
sqlite> insert into user values (6, 'yourkuma', ' Seoul', 17);
sqlite> 
sqlite> select * from seouluser;
1|devkuma
3|araikuma
4|happykuma
6|yourkuma
sqlite> 

이렇게 뷰는 뷰 자체에서 데이터를 유지하고 있는 것은 아니라, 원본이 되는 테이블을 매번 가져온다는 점을 유의하도록 하자.

뷰에서 데이터 추가 및 삭제

뷰에서 데이터를 조회할 수는 있지만, 뷰에 데이터를 추가하거나 삭제, 데이터 업데이트 등의 작업을 수행할 수 없다.

실제로 해보면 다음과 같이 “Error: cannot modify seouluser because it is a view” 오류가 발생한다.

insert into seouluser values (8, 'kuma');
sqlite> insert into seouluser values (8, 'kuma');
Error: cannot modify seouluser because it is a view
sqlite> 

생성된 뷰 목록 조회

생성된 뷰의 목록만 조회하는 방법은 없지만, SQLite 명령 .tables를 실행하면 생성된 테이블뿐만 아니라 뷰도 함께 표시된다.

.tables
sqlite> .table
seouluser  user     
sqlite> 

그리고 SQLite의 특별한 테이블인 sqlite_master 테이블에서 다음과 같이 생성된 뷰의 이름과 생성되었을 때의 SQL 문을 얻을 수 있다.

select name, sql from sqlite_master where type = 'view';
sqlite> select name, sql from sqlite_master where type = 'view';
seouluser|CREATE VIEW seouluser as select id, name from user where address = 'Seoul'
sqlite> 



최종 수정 : 2019-11-13