1つ以上の表から導かれる仮想的な表。
ビューとは、1つ以上の表(テーブル)から導かれる仮想的な表のことです。実際にデータを保存している表を「実表(じっぴょう)」と呼びますが、ビューは「実表に対するSELECT文(問合せ)」に名前を付けて保存したもので、データの実体そのものは持ちません。
ビューを参照すると、その都度ビュー定義のSELECT文が実行され、実表から最新のデータを取り出して仮想的な表として見せてくれます。利用者からは普通の表と同じように SELECT * FROM ビュー名 で扱えます。
身近な例で考えると、図書館の「新刊コーナー」に似ています。本棚(実表)には全ての本が並んでいますが、「新刊コーナー」という案内(ビュー)は条件に合う本だけをまとめて見せる入口です。上の図解で、2つの実表から「氏名と部署名」だけを見せるビューが作られる流れを確認できます。
ビューを使うと、主にセキュリティ(機密の保護)と抽象化(複雑さの隠蔽)という2つの利点が得られます。
・機密列を隠せる:実表に給与のような機密列があっても、ビューには公開してよい列だけを含めれば、利用者には機密列が見えません
・行を絞れる:「自分の部署の行だけ」のように条件付きのビューを作れば、利用者ごとに見せる範囲を分けられます
・複雑な問合せを再利用できる:何度も書く長い結合(JOIN)をビューに包めば、以後はビュー名だけで簡潔に呼び出せます
抽象化の観点では、実表の構造(列の並びや結合関係)が変わっても、ビューの定義側だけ直せば利用者側のSELECT文を書き換えずに済むという利点もあります。実表の細かい事情を利用者から隠す「目隠し」の役割です。
身近な例で考えると、会社の受付のようなものです。来客(利用者)は受付(ビュー)で必要な案内だけを受け取り、社内の機密資料(機密列)や複雑な組織図(結合)を直接見る必要はありません。必要な情報だけを安全に渡す窓口がビューです。
ビューと物理テーブル(実表)の最大の違いは、データの実体を持つかどうかです。実表はディスクにデータを保存していますが、ビューは定義(問合せ)だけを持ち、参照のたびに実表から値を組み立てます。
| 項目 | 物理テーブル(実表) | ビュー |
|---|---|---|
| データの実体 | 持つ(ディスクに保存) | 持たない(定義のみ) |
| 最新性 | 保存された値 | 常に実表の最新値を反映 |
| 記憶領域 | 行数に応じて消費 | ほぼ消費しない |
| 更新 | 自由に更新可能 | 条件次第で制限あり |
ビューは実体を持たないので、実表のデータが更新されればビューの内容も自動的に最新の状態になります。ただし、複数の表を結合したビューや集計を含むビューは、どの実表のどの行を直せばよいか一意に決まらないため、更新できない(読み取り専用になる)場合がある点に注意しましょう。
ビューを新しく作るには CREATE VIEW ビュー名 AS SELECT文 という形の SQL を使います。「AS」のあとに書いた SELECT 文がビューの定義として記録されます。
CREATE VIEW 社員一覧 AS
SELECT 氏名, 部署名
FROM 社員 JOIN 部署
ON 社員.部署ID = 部署.部署ID
これを実行するとデータベースに「社員一覧」という名前のビューが登録されます。以後は SELECT * FROM 社員一覧 と書くだけで、複雑な JOIN を毎回書かなくて済みます。なぜ便利かというと、一度定義すれば何度でも簡単に呼び出せるからです。
ビューを削除したいときは DROP VIEW ビュー名 を使います。ビューの定義だけが消え、もとの実表のデータはそのまま残ります。ビューはあくまで「見かけの表」なので、消しても実データには影響しません。
利用者が SELECT * FROM 社員一覧 のようにビューを参照すると、データベースはビューの定義(あらかじめ登録したSELECT文)をその場で実行し、実表から値を集めて結果を作って返します。
なぜ「仮想」と呼ぶかというと、ビュー自身はデータをどこにも保存していないからです。テーブルのように「ここにデータがある」という実体がなく、参照されるたびに実表から作り出されます。
・実表を更新した直後にビューを見ると、常に最新の値が見える
・ビューを参照するたびにSELECT文が内部で実行される
・ビューを削除しても実表のデータは消えない
身近な例で考えると、「今日の天気予報」のWebページのようなものです。そのページ(ビュー)自体にデータは入っておらず、開くたびに気象サーバ(実表)から最新の情報を取得して表示します。同じURLでも昨日と今日で内容が違うのは、毎回最新データで生成されるからです。ビューも同じ仕組みで動いています。