ビューの使いどころ(SQLiteを学ぶ_17)

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

hirocom777.hatenadiary.org

前回は、SQLiteのビューについてご紹介しました。なかなか面白そうな機能ですね!!

今回はそんなビューの使いどころについて考えてみようと思います。

ビューとは何なのか(おさらい)

まずおさらいなのですが、SQLiteのビューとは「すでにあるテーブルからSELECT文で指定した内容を、テーブルとして使用できる機能」です。使用前にあらかじめ設定しておきます。

前回もお話ししたのですが、ビューはサブクエリに似ています。どちらもテーブルの様にデータにアクセスできるのですが、テーブル、サブクエリ、ビューの違いは何なんでしょうか?

答えはデータの保持形式の違いです。

  • テーブル

    永続的にデータを保持する。

  • サブクエリ

    データ保持は記述されるSQL文内だけで有効。永続的ではない。

  • ビュー

    永続的ではあるが、データは保持していない。アクセスされる都度にSELECT文が実行される。

以上が3つの違いです。

ビューの使いどころ

それではビューの使いどころは何処なのでしょうか?

SQLの簡略化

最初に思い浮かぶのはSQLの簡略化です。サブクエリは便利なのですが、SQL文が長くなりがちです。サブクエリの代わりにビューを使用すると、本体のSQL文とは別に記述することでSQL文はシンプルになります。同じサブクエリを別々のSQL文で呼び出い場合はビューを使って、あらかじめ設定しておいた方がいいですね。

テーブルの整形

複数のテーブルを結合、統合した形のSQLをビューとして保存しておくことで、元のテーブルが変更になれば、すぐに更新されたデータが取得できます。

セキュリティ

ビューを使うことでセキュリティの向上が見込めます。ビューで表示されるデータは変更できないからです。 また他にも、データベースの運用でクライアント側でアクセスする内容を制限したい時に便利です。公開するテーブルをビューで指定すれば、以下の様なテーブルが実現可能です。

  • 表示する列を制限したい
  • 指定された条件を満たす行だけ表示できるようにしたい
  • 表示する列名を運用側とクライアント側で変更したい

などです。いずれもビューを構成するSELECT文で指定しておけばいいのです。

スカラサブクエリの代わりになる?

スカラサブクエリとは1つの値だけを返すサブクエリの事です。SQL文の中で値として扱うことができます。ビューでも同じができるのでしょうか?確認してみましょう。

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

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 AVG(age) FROM sample;
sqlite> SELECT * FROM test;
┌──────────────────┐
│     AVG(age)     │
├──────────────────┤
│ 27.3333333333333 │
└──────────────────┘

年齢が平均より上人のデータを取得しようとすると・・・

sqlite> SELECT * FROM sample WHERE test < age;
Parse error: no such column: test
  SELECT * FROM sample WHERE test < age;
               error here ---^

ビュー「test」は、列名として認識されたようです。スカラサブクエリの代わりとしては使えないようですね。 ちなみにスカラサブクエリを使用すると以下の様になりました。

sqlite> SELECT AVG(age) FROM sample;
┌──────────────────┐
│     AVG(age)     │
├──────────────────┤
│ 27.3333333333333 │
└──────────────────┘
sqlite> SELECT * FROM sample WHERE (SELECT AVG(age) FROM sample) < age;
┌────┬──────────┬─────┐
│ id │   name   │ age │
├────┼──────────┼─────┤
│ 2  │ 'YAMADA' │ 30  │
└────┴──────────┴─────┘

ちゃんと求めることができました。

使用時の注意点

次にビューを使用する際の注意点について考えてみましょう。

集約関数

ビューを作成するSELECT文に集約関数(SUM、AVG、COUNT、MAX、MIN)や集合演算子(UNION、INTERSECT、EXCEPT)を使用すると、呼び出されるたびに計算がされるため処理が遅くなります。できるだけ使用しないようにしましょう。ビューは実際のデータを保持していないことに留意してください。

多重ビュー

ビューを作成するSELECT文の中に、他のビューを記述できます。これを多重ビューと呼ぶのですが、コチラも上と同じ理由で使用は避けましょう。ビューが呼び出されると同時に内部のビューも呼び出されてしまい、結果処理が遅くなります。

次回は複数のデータベース

次回は複数のデータベースの取り扱いについて取り組みます。ここまでご紹介した例は、1つのデータベースファイル、1つのテーブルについてでした。でも複数のデーベースに渡ってアクセスしたい事もあると思います。お楽しみに!!

hirocom777.hatenadiary.org

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