SQLiteを学んでいこうという連載の16回目です。前回の記事はこちらになります。
前回は、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>
ビューの削除ができました。
ビューの使いどころ
いかがでしょうか。なかなか面白そうな機能ですね。次回はビューの使いどころを考えてみようと思います。お楽しみに!!