ビュー(SQLiteを学ぶ_16)

SQLiteを学んでいこうという連載の16回目です。前回の記事はこちらになります。

hirocom777.hatenadiary.org

前回は、SQLiteのROWID機能の働きについてご紹介しました。INTEGER型のPRIMARY KEY制約と関係があるんですね。

今回はSQLiteの機能の1つであるビューをご紹介します。はたして何に使うのでしょうか。

ビューとは何か

SQLにはサブクエリという記述方式があります。サブクエリとはカッコで括ったSELECT文の事です。SQL文の中にサブクエリを記述すると、その中の内容から優先的に実行されます。実行した結果はテーブルの形で返ってきて、複雑なSQL文をシンプルに記述できたりします。ビューもこれに似ています。

ビューはすでにあるテーブルからSELECT文で指定した内容を、テーブルとして使用できる機能です。サブクエリの様にSQL文の中に記述するものではなく、あらかじめ指定しておきます。サブクエリは記述されたSQL文の中でのみ有効ですが、ビューは一度作成されると削除されるかデータベースがクローズされるまで有効になります。

ビューの作成

それでは実際にビューを作成して動きを確認してみましょう。ビューの作成は以下で行います。

CREATE VIEW ビュー名 AS SELECT文;

まず、以下の手順でテーブルを作成します。

sqlite> CREATE TABLE sample(id INTEGER,name TEXT,age INTEGER);
sqlite> INSERT INTO sample VALUES(1,"TANAKA",25);
sqlite> INSERT INTO sample VALUES(2,"YAMADA",30);
sqlite> INSERT INTO sample VALUES(3,"OOTA",27);

次にビューを作成します。

sqlite> CREATE VIEW test AS SELECT * FROM sample;

ビューの確認

作成されたビューは、他のテーブルとあわせてドットコマンドの「.tables」で確認できます。

sqlite> .tables
sample  test

内部テーブル「sqlite_master」を確認するとデータベースファイル内の恒星が確認できるんでしたよね。

sqlite> SELECT * FROM sqlite_master;
┌─────────┬──────────┬──────────┬──────────┬─────────────────────────────────────────────────────────┐
│  type   │   name   │ tbl_name │ rootpage │                           sql                           │
├─────────┼──────────┼──────────┼──────────┼─────────────────────────────────────────────────────────┤
│ 'table' │ 'sample' │ 'sample' │ 2        │ 'CREATE TABLE sample(id INTEGER,name TEXT,age INTEGER)' │
│ 'view'  │ 'test'   │ 'test'   │ 0        │ 'CREATE VIEW test AS SELECT * FROM sample'              │
└─────────┴──────────┴──────────┴──────────┴─────────────────────────────────────────────────────────┘

ビューの内容の確認は、テーブルと同じです。

sqlite> SELECT * FROM test;
┌────┬──────────┬─────┐
│ id │   name   │ age │
├────┼──────────┼─────┤
│ 1  │ 'TANAKA' │ 25  │
│ 2  │ 'YAMADA' │ 30  │
│ 3  │ 'OOTA'   │ 27  │
└────┴──────────┴─────┘

大元のテーブルとの関係

大元のテーブルが変更になったらどうなるのでしょうか。テーブル「sample」にデータを追加してみましょう。

sqlite> INSERT INTO sample VALUES(4,"MURAYAMA",22);
sqlite> SELECT * FROM test;
┌────┬────────────┬─────┐
│ id │    name    │ age │
├────┼────────────┼─────┤
│ 1  │ 'TANAKA'   │ 25  │
│ 2  │ 'YAMADA'   │ 30  │
│ 3  │ 'OOTA'     │ 27  │
│ 4  │ 'MURAYAMA' │ 22  │
└────┴────────────┴─────┘

大元のテーブル変更内容が、ビューにも反映されています。ちなみにビュー自体は編集することができません。

大元のテーブルを削除するとどうなるのでしょうか。

sqlite> DROP TABLE sample;
sqlite> SELECT * FROM test;
Parse error: no such table: main.sample

大元のテーブルがないと怒られてしまいました。再度同じ名前のテーブルを作ると内容も復活します(!!)。

ビューの削除

作成したビューの削除はSQL文の「DROP VIEW」で行います。

DROP VIEW ビュー名;

ビューを削除してみましょう。

sqlite> DROP VIEW test;
sqlite> .tables
sqlite>

ビューの削除ができました。

ビューの使いどころ

いかがでしょうか。なかなか面白そうな機能ですね。次回はビューの使いどころを考えてみようと思います。お楽しみに!!

hirocom777.hatenadiary.org

SQLite学習記事のまとめですはこちらから