MySQL
VIEW
サーチ…
構文
CREATE VIEW view_name AS SELECT column_name(s)FROM table_name WHERE条件です。 ///シンプルなビューの作成構文
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED |マージ| TEMPTABLE}] [DEFINER = {user | CURRENT_USER}] [SQLセキュリティ| DEFINER | INVOKER}] VIEWビュー名[(列リスト)] AS select_statement [WITH [CASCADED |ローカル] CHECK OPTION]; ///完全なビューの作成構文
DROP VIEW [IF EXISTS] [db_name。]ビュー名; ///ドロップビューの構文
パラメーター
パラメーター | 詳細 |
---|---|
ビュー名 | ビューの名前 |
SELECTステートメント | ビューにパックされるSQLステートメント1つ以上のテーブルからデータをフェッチするSELECT文にすることができます。 |
備考
ビューは仮想テーブルであり、返されるデータは含まれません。複雑な問合せを何度も何度も書くことを避けることができます。
- ビューが作成される前に、その仕様は完全に
SELECT
ステートメントから構成されます。SELECT
文にFROM句にサブクエリを含めることはできません。 - 一度ビューが作成されると、テーブルのように大部分が使用され、テーブルのように
SELECT
できます。
テーブルのいくつかの列を他のユーザーから制限したい場合は、ビューを作成する必要があります。
- たとえば、組織では、マネージャが「Sales」という名前のテーブルから情報をほとんど表示しないようにしたいが、ソフトウェアエンジニアがテーブル「Sales」のすべてのフィールドを表示する必要はない。ここでは、マネージャとソフトウェアエンジニアのために2つの異なるビューを作成できます。
パフォーマンス 。 VIEWs
は構文的な砂糖です。ただし、ビューの選択が折り畳まれた同等のクエリよりパフォーマンスが悪い場合もあれば、悪い場合もあります。オプティマイザはこれを「折り畳み」しようとしますが、必ずしも成功するとは限りません。 MySQL 5.7.6ではオプティマイザの機能がさらに強化されました。しかし、 VIEW
を使用しても、問合せを高速化することはできません。
ビューを作成する
特権
CREATE VIEW文には、ビューに対するCREATE VIEW権限と、SELECT文で選択された各列に対する権限が必要です。 SELECTステートメントの他の場所で使用される列の場合は、SELECT特権が必要です。 OR REPLACE句が存在する場合は、ビューに対するDROP権限も必要です。このセクションの後半で説明するように、CREATE VIEWにはDEFINER値に応じてSUPER特権が必要な場合があります。
ビューが参照されると、権限チェックが行われます。
ビューはデータベースに属します。デフォルトでは、デフォルトのデータベースに新しいビューが作成されます。特定のデータベースに明示的にビューを作成するには、完全修飾名
例えば:
db_name.view_name
mysql> CREATE VIEW test.v AS SELECT * FROM t;
注 - データベース内では、ベーステーブルとビューは同じ名前空間を共有するので、ベーステーブルとビューは同じ名前を持つことはできません。
VIEWは次のことができます:
- 多くの種類のSELECT文から作成する
- ベーステーブルまたは他のビューを参照
- 結合、UNION、およびサブクエリを使用する
- SELECTはテーブルを参照する必要はありません
もう一つの例
次の例では、別のテーブルから2つの列を選択するビューと、それらの列から計算された式を定義しています。
mysql> CREATE TABLE t (qty INT, price INT);
mysql> INSERT INTO t VALUES(3, 50);
mysql> CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t;
mysql> SELECT * FROM v;
+------+-------+-------+
| qty | price | value |
+------+-------+-------+
| 3 | 50 | 150 |
+------+-------+-------+
制限事項
- MySQL 5.7.7より前では、SELECT文にFROM句にサブクエリを含めることはできません。
- SELECTステートメントは、システム変数またはユーザー定義変数を参照することはできません。
- ストアド・プログラム内で、SELECTステートメントはプログラム・パラメーターまたはローカル変数を参照することはできません。
- SELECTステートメントは、プリペアドステートメントパラメーターを参照することはできません。
- 定義に参照されているテーブルまたはビューが存在する必要があります。ビューが作成された後、テーブルまたはビューをドロップすることができます。
定義はを指します。この場合、ビューを使用するとエラーが発生します。この種の問題のビュー定義をチェックするには、CHECK TABLEステートメントを使用します。 - 定義はTEMPORARYテーブルを参照することはできません。
TEMPORARYビューを作成します。 - トリガーをビューに関連付けることはできません。
- SELECT文の列名のエイリアスは、最大エイリアスではなく、64文字の最大列長と照合されます
256文字の長さ)。 -
VIEW
は、同等のSELECT
と同様に最適化することも最適化しないこともできます。それ以上に最適化することはまずありません。
2つのテーブルからのビュー
ビューは、複数の表からデータを取り込むために使用できる場合に最も便利です。
CREATE VIEW myview AS
SELECT a.*, b.extra_data FROM main_table a
LEFT OUTER JOIN other_table b
ON a.id = b.id
MySQLビューでは、ビューはマテリアライズされません。 SELECT * FROM myview
という簡単なクエリを実行すると、mysqlは実際にシーンの後ろにLEFT JOINを実行します。
作成されたビューは、他のビューやテーブルに結合することができます
VIEWによる表の更新
VIEW
はテーブルのように非常に機能します。あなたはできますがUPDATE
表を、あなたは、またはそのテーブルにビューを更新することができない可能性があります。一般に、ビュー内のSELECT
が一時表を必要とするほど複雑な場合、 UPDATE
は許可されません。
GROUP BY
、 UNION
、 HAVING
、 DISTINCT
、およびいくつかのサブクエリのようなものは、ビューを更新できないようにします。 リファレンスマニュアルの詳細。
ビューを削除する
- 現在のデータベースにビューを作成して削除します。
CREATE VIEW few_rows_from_t1 AS SELECT * FROM t1 LIMIT 10;
DROP VIEW few_rows_from_t1;
- 異なるデータベースのテーブルを参照するビューを作成して削除する。
CREATE VIEW table_from_other_db AS SELECT x FROM db1.foo WHERE x IS NOT NULL;
DROP VIEW table_from_other_db;