やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

SQLite3構文 view(create/drop)

 ビューの作成・削除。ビューは読取専用。

成果物

構文

テーブル・ビュー・インデックスの違い

 以下のような違いがある。合っているかはわからない。

DBオブジェクト 違い 目的
テーブル 物理バイナリ 永続化
インデックス ソートしたテーブルを物理バイナリやメモリに保持する select高速化
ビュー テーブルから抽出した読取専用のデータセット。物理的には存在しない 特定クエリの短縮
仮想テーブル そもそもRDBMS上のデータではない。そうみせかけるための仮想化システム。C言語で実装する。 何かを仮想化してSQLで操作する

create view as

create table T(A integer);
insert into T values(-2),(-1),(0),(1),(2),(3),(4);
create view positive_T as select * from T where 0<A;
select * from positive_T;
1
2
3
4

 sqlite_master表に追加される。

.headers on
select * from sqlite_master where type='view';
type|name|tbl_name|rootpage|sql
view|positive_T|positive_T|0|CREATE VIEW positive_T as select * from T where 0<A

create view if not exists as

 同名のビューを作成しようとすると以下エラーが出る。

Error: table ビュー名 already exists

 これを回避するのがif not exists

create table T(A integer);
create view if not exists positive_T as select * from T where 0<A;
create view if not exists positive_T as select * from T where 0<A;



create temp view as

 スキーマtempにビューを作成する。

create table T(A integer);
create temp view positive_T as select * from T where 0<A;

 mainスキーマには作られていない。

select count(*) from main.sqlite_master where type='view';
0

 tempスキーマに作られている。

select count(*) from temp.sqlite_master where type='view';
1

create view スキーマ名.表名(列名,...) as

 任意のスキーマにビューを作成する。

create table T(A integer);
attach ':memory:' as 'mem';
create view mem.positive_T as select * from T where 0<A;

 memスキーマに作成された。

select count(*) from mem.sqlite_master where type='view';
1

 main,tempスキーマには作成されていない。

select count(*) from main.sqlite_master where type='view';
0
select count(*) from temp.sqlite_master where type='view';
0

 列を任意にできる。

create table T(A integer);
insert into T values(1);
create view positive_T(B, C) as select A, 1 from T where 0<A;
.headers on
select * from positive_T;
B|C
1|1

 列名がAからBになった。また、スカラー1の列を作り、列名をCとした。

drop view

create table T(A integer);
create view positive_T as select * from T;
drop view positive_T;
select count(*) from sqlite_master where type='view';
0

drop view if exists

 存在しないのに削除しようとすると、以下エラーが出る。

Error: no such view: ビュー名

 これをを回避するのがif exists

create table T(A integer);
create view positive_T as select * from T;
drop view positive_T;
drop view if exists positive_T;



対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux

前回まで