メインコンテンツへスキップ

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
ビューは、データベースに格納された名前付きのクエリです。ビューへの問い合わせはテーブルへの問い合わせとまったく同じに見えますが、ビューの SELECT はクエリの実行時に実行されます。別にデータが格納されているわけではありません。

ビューの作成と照会

基になる定義を確認するには、次を実行します。
ビューを変更するには、CREATE OR REPLACE VIEW を使用します。
ビューを削除するには、次を実行します。

更新可能なビュー

一部のビューは、ビューを通じた INSERT、UPDATE、および DELETE をサポートします。ビューが単一の基になるテーブルにきれいに対応する場合、そのビューは更新可能です。
  • 書き込むすべての列が単一の基になるテーブルに属している。JOIN に対するビューもこのルールのもとでは更新可能ですが、それを通じた INSERT は黙って一方のテーブルだけに作用し、もう一方には行をまったく挿入しません。ただし、1 つの INSERT で両方の基になるテーブルの列に書き込む場合は黙って行われず、ERROR 1393: Can not modify more than one base table through a join view が発生します
  • DISTINCT がない
  • 集計関数(SUM、COUNT など)がない
  • GROUP BY や HAVING がない
  • WHERE 句に同じテーブルを参照するサブクエリがない
  • UNION がない
MySQL は基になる customers テーブルを更新します。ビューが行を絞り込んでいる場合、ビューを通じて見えなくなる値に行を UPDATE できます。その行は基のテーブルには存在し続けますが、ビューからは消えます。

WITH CHECK OPTION

WITH CHECK OPTION は、ビューを通じて行が見えなくなるような、ビュー経由の挿入と更新を防ぎます。
ビューが意味のあるデータのサブセットを表し、それを通じた挿入と更新がそのサブセット内にとどまることを保証したい場合に、WITH CHECK OPTION を使用してください。

ビューのアルゴリズム

MySQL は、2 つのアルゴリズムのいずれかを使用してビューを実行します。 TEMPTABLE は、外側のクエリが実行される前にビューの結果全体が計算されることを意味します。オプティマイザは、外側のクエリの WHERE 条件をビューにプッシュダウンすることができません。TEMPTABLE ビューで絞り込みを効率的に機能させるには、フィルタがビュー自身の定義の中になければなりません。 不意打ちを避けるには、アルゴリズムを明示的に指定します。
MySQL が要求されたアルゴリズムを満たせない場合、Warning 1354 を発生させ、ビューを ALGORITHM=UNDEFINED として格納します。SHOW CREATE VIEW が報告するのはこれであり、TEMPTABLE ではありません。オプティマイザはその後、実行時にそうしたビューを実体化します。

ビューにはインデックスがない

ビューは独自のインデックスを持ちません。MERGE ビューに対するクエリは、基になるテーブルのインデックスを使用できます。TEMPTABLE ビューに対するクエリは使用できません。一時テーブルにはインデックスがないためです。 頻繁に照会されるビューの結果にインデックスが必要な場合、選択肢は次のとおりです。
  • ビューが MERGE アルゴリズムを使用するようにし、基になるテーブルの列にインデックスを作成する
  • ビューを、ジョブやトリガーによってデータが投入される実テーブルに置き換える

よくある質問

ビューはいつ使うべきですか?

ビューは、アクセス制御(列や行のサブセットをユーザーに公開する)、複数のクエリが使用する複雑な結合の単純化、および基になるスキーマが変わりうる場合に安定したインターフェースを提供することに適しています。ビューはパフォーマンスのための道具ではありません。データをキャッシュしたり格納したりはしません。

ビューを結合できますか?

はい。2 つの MERGE ビューを結合することは、事実上 2 つの基になるクエリを結合することです。MySQL は全体を書き換えます。TEMPTABLE ビューの結合は、各ビューがまず独立して実体化されるため遅くなります。複雑な結合では、共通テーブル式のほうが実行をより細かく制御できることがよくあります。

基になるテーブルが変わると、ビューは自動的に更新されますか?

ビューの定義は SQL テキストとして格納されます。基のテーブルに列を追加しても、ビューからの SELECT * にはその列は含まれません。CREATE OR REPLACE VIEW が必要です。ビューが参照する列の名前を変更したり削除したりすると、ビューは無効になり、再作成するまでそのビューに対するクエリはエラーになります。

トラブルシューティング

関連項目