CREATE
    [OR REPLACE]
    [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    [DEFINER = { user | CURRENT_USER }]
    [SQL SECURITY { DEFINER | INVOKER }]
    VIEW view_name [(column_list)]
    AS select_statement
    [WITH [CASCADED | LOCAL] CHECK OPTION]
        CREATE VIEW
        ステートメントは、新しいビューを作成するか、または
        OR REPLACE
        節が指定されている場合は既存のビューを置き換えます。そのビューが存在しない場合、CREATE
        OR REPLACE VIEW は
        CREATE VIEW
        と同じになります。ビューが存在する場合、CREATE
        OR REPLACE VIEW は
        ALTER VIEW
        と同じになります。
      
        select_statement
        はビューの定義を提供する
        SELECT
        ステートメントです。(ビューから選択すると、実際には
        SELECT
        ステートメントを使用して選択されます。)
        select_statement
        は、ベーステーブルまたはほかのビューから選択できます。
      
        ビュー定義は作成時に「凍結される」ため、基礎となるテーブルへのそれ以降の変更はビュー定義に影響を与えません。たとえば、ビューがテーブル上で
        SELECT *
        として定義されている場合、あとでテーブルに追加された新しいカラムはそのビューの一部になりません。
      
        ALGORITHM 節は、MySQL
        によるビューの処理方法に影響を与えます。DEFINER
        節および SQL SECURITY
        節はビューの呼び出しにおいて、アクセス権限を確認するとき使用すべきセキュリティーコンテキストを規定します。WITH
        CHECK OPTION
        節を指定すると、ビューによって参照されているテーブル内の行への挿入または更新を制約できます。これらの節については、この節のあとの方で説明します。
      
        CREATE VIEW
        ステートメントには、ビューに対する
        CREATE VIEW
        権限と、SELECT
        ステートメントによって選択される各カラムに対する何らかの権限が必要です。SELECT
        ステートメントの中で使用されているほかのカラムに対して、SELECT
        権限を所持していなければなりません。OR
        REPLACE 節が存在している場合、ビューの
        DROP
        権限を所持していなければなりません。
      
        ビューはデータベースに付随します。デフォルト設定によって、デフォルトデータベースの中に新しいビューが生成されます。あるデータベース中にビューを明確に生成させるには、ビューを生成するとき、その名称を
        db_name.view_name
        と規定してください。
      
mysql> CREATE VIEW test.v AS SELECT * FROM t;
ベーステーブルとビューはデータベース中で同じ名前空間を共有しているので、データベースに同じ名称のベーステーブルとビューを含めることはできません。
        ビューには、ベーステーブルと同じように、ユニークなカラム名を重複することなく持たせなければなりません。デフォルト設定に基づき、SELECT
        ステートメントによって復元されたカラムの名称がビューカラム名に対して使用されます。ビューカラムに対して明確な名称を規定するため、オプションの
        column_list
        節をコンマで区切りをつけた識別子のリストとして附与することができます。column_list
        の中に入れる名称の数は
        SELECT
        ステートメントによって復元されたカラムの数と同じでなければなりません。
      
          MySQL 5.1.29
          より前のバージョンでは、既存のビューを変更すると、現在のビュー定義がバックアップおよび保存されます。ビュー定義は、そのテーブルのデータベースディレクトリの
          arc
          という名前のサブディレクトリに格納されます。ビュー
          v
          のバックアップファイルには、v.frm-00001
          という名前が付けられます。もう一度ビューを変更すると、次のバックアップには
          v.frm-00002
          という名前が付けられます。最新の 3
          つのビューのバックアップ定義が格納されます。
        
バックアップされたビュー定義は、mysqldump やその他の類似のプログラムでは保持されませんが、ファイルコピー操作を使用して保持できます。ただし、これらのビュー定義は、以前のビュー定義のバックアップとしてのみ使用されます。
          これらのバックアップ定義の削除は、mysqld
          が実行中でない場合にのみ安全です。mysqld
          の実行中に arc
          サブディレクトリまたはそこに含まれるファイルを削除すると、次回そのビューを変更しようとしたときにエラーが表示されます。
        
mysql> ALTER VIEW v AS SELECT * FROM t; ERROR 6 (HY000): Error on delete of '.\test\arc/v.frm-0004' (Errcode: 2)
        SELECT
        ステートメントによって復元されたカラムはテーブルカラムを引用するシンプルなものにすることができます。これらは関数、定数値、オペレータ等を使用した表現にすることもできます。
      
        SELECT
        ステートメント中の不適切なテーブル名あるいはビュー名はデフォルトデータベースに対して解釈されます。ビューには、適切なデータベース名を使ってそのテーブルまたはビュー名に資格を附与することによって、ほかのデータベース中のテーブルまたはビューを引用することができます。
      
        ビューは多くの種類の
        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 | +------+-------+-------+
ビュー定義は以下の制限に規定されます。
            SELECT
            ステートメントは
            FROM
            節の中にサブ・クエリーを含めることができません。
          
            SELECT
            ステートメントはシステム変数またはユーザー変数を参照することができません。
          
ストアドプログラム内で、ビュー定義はプログラムパラメータまたはローカル変数を参照できません。
            SELECT
            ステートメントは準備済みステートメントパラメータを参照することができません。
          
            定義で参照したテーブルまたはビューは存在しなければいけません。ただし、ビューを生成し終えたあとに、定義が参照するテーブルまたはビューを撤去することができます。この場合、ビューの使用はエラーとなります。この類の問題に対してビュー定義を確認するには、CHECK
            TABLE
            ステートメントを使用してください。
          
            定義は TEMPORARY
            テーブルを参照できない上、TEMPORARY
            ビューを生成させることができません。
          
ビュー定義で指定されているすべてのテーブルが、定義時に存在する必要があります。
トリガーにビューを関連させることはできません。
            MySQL 5.1.23
            では、SELECT
            ステートメント内のカラム名のエイリアスは
            (256 文字の最大エイリアス長ではなく) 64
            文字の最大カラム長に対して確認されます。
          
        ORDER BY
        はビュー定義の中で許容されていますが、それ自身
        ORDER BY
        を持つステートメントを使ってビューから選択すると無視されます。
      
        定義中のほかのオプションあるいは節に対して、オプションまたはビューを参照するステートメントの節が追加されましたが、その効果は定義されていません。たとえば、ビュー定義に
        LIMIT
        節が含まれているとき、それ自身の
        LIMIT
        節を持つステートメントを使って選択すると、いずれの限界か適用されるかが定義されていません。SELECT
        キーワードに従う
        ALL、DISTINCT
        または
        SQL_SMALL_RESULT
        のようなオプション並びに
        INTO、FOR
        UPDATE、LOCK IN SHARE
        MODE および
        PROCEDURE
        のような節に関しては、同じ原理が適用します。
      
ビューを生成させてから、システム変数を変えることによってクエリー処理環境を変えると、ビューから得る結果が影響されることがあります。
mysql>CREATE VIEW v (mycol) AS SELECT 'abc';Query OK, 0 rows affected (0.01 sec) mysql>SET sql_mode = '';Query OK, 0 rows affected (0.00 sec) mysql>SELECT "mycol" FROM v;+-------+ | mycol | +-------+ | mycol | +-------+ 1 row in set (0.01 sec) mysql>SET sql_mode = 'ANSI_QUOTES';Query OK, 0 rows affected (0.00 sec) mysql>SELECT "mycol" FROM v;+-------+ | mycol | +-------+ | abc | +-------+ 1 row in set (0.00 sec)
        DEFINER および
        SQL SECURITY
        節によって、ビューを参照するステートメントの実行時にそのビューに対するアクセス権限を確認するときに使用する
        MySQL
        アカウントが決定されます。これらの節は、MySQL
        5.1.2 で追加されました。SQL
        SECURITY
        特性の正当な値は、DEFINER
        および INVOKER
        です。これらの値は、それぞれ、このビューを定義したユーザーまたはこのビューを呼び出したユーザーが必要な権限を保持している必要があることを示します。SQL
        SECURITY のデフォルト値は
        DEFINER です。
      
        DEFINER 節に対して
        user
        値を指定する場合は、'
        の形式 (user_name'@'host_name'GRANT
        ステートメントで使用されるのと同じ形式) の
        MySQL
        アカウントである必要があります。user_name
        の値と host_name
        の値が両方共要求されます。定義者はまた、CURRENT_USER
        または
        CURRENT_USER()
        として指定することもできます。DEFINER
        のデフォルト値は
        CREATE VIEW
        ステートメントを実行するユーザーです。これは、明示的に
        DEFINER = CURRENT_USER
        を指定するのと同じです。
      
        DEFINER
        節を指定する場合は、これらの規則によって正当な
        DEFINER
        ユーザー値が決定されます。
      
            SUPER
            権限を持っていない場合、文字によるか、CURRENT_USER
            を使って規定されている
            user
            値だけが有効なユーザーアカウントとなります。定義子をほかのアカウントに設定することはできません。
          
            SUPER
            権限を持っている場合、構文的に有効なアカウントネームを規定することができます。そのアカウントが実在しない場合、警告が生成されます。
          
            SQL SECURITY 値が
            DEFINER
            であるにもかかわらず、ビューが参照されるときに定義者のアカウントが存在しない場合は、エラーが発生します。
          
        MySQL 5.1.12
        では、ビュー定義内で、CURRENT_USER
        はデフォルトでそのビューの
        DEFINER
        値を返します。旧バージョンの場合、および
        SQL SECURITY INVOKER
        特性を使用して定義されたビューの場合、CURRENT_USER
        はビューの呼び出し元のアカウントを返します。ビュー内のユーザー監査については、Auditing MySQL Account Activity
        を参照してください。
      
        SQL SECURITY DEFINER
        特性を使用して定義されたストアドルーチン内で、CURRENT_USER
        は、そのルーチンの
        DEFINER
        値を返します。ビュー定義に
        CURRENT_USER の
        DEFINER
        値が含まれている場合は、これによって、このようなプログラム内で定義されたビューも影響を受けます。
      
        DEFINER 節と
        SQL SECURITY
        節が実装されたとき)MySQL 5.1.2
        以降、ビュー権限はこのようにして確認されます。
      
ビューを定義するとき、ビュー作成者は、ビューがアクセスしたトップレベルのオブジェクトの使用に要する権限を持っていなければなりません。たとえば、先に説明したように、ビュー定義でテーブルカラムを参照している場合、作成者はそのカラムに対する権限を持っている必要があります。定義でストアドファンクションを参照している場合は、その関数を呼び出すために必要な権限を確認するだけで済みます。 ファンクションを作動させるに要する権限は、それを実行するときにだけ確認することができます。ファンクションを呼び出す方法が異なると、ファンクション中にある別な実行パスを使用しなければなない場合があります。
            ビューが参照されている場合、そのビューによってアクセスされるオブジェクトに対する権限は、SQL
            SECURITY 特性が
            DEFINER または
            INVOKER
            のどちらであるかに応じて、それぞれ、ビュー作成者または呼び出し元が保持している権限に対して確認されます。
          
            ビューへの参照によってストアドファンクションの実行が発生する場合、その関数内で実行されるステートメントに対する権限の確認は、その関数が
            DEFINER または
            INVOKER のどちらの
            SQL SECURITY
            特性を使用して定義されているかによって異なります。セキュリティー特徴が
            DEFINER
            である場合、ファンクションはその作成者の権限を使って作動します。その特徴が
            INVOKER
            である場合、ファンクションはビューの
            SQL SECURITY
            特徴によって決定された権限を使用して作動します。
          
        DEFINER および
        SQL SECURITY
        節が実装される前の)5.1.2 以前の MySQL
        の場合、ビュー中でオブジェクトの使用に要する権限はビュー生成時に確認されます。
      
        例:ビューは保存されているファンクションに依存し、そのファンクションはほかストアドルーチンを起動する場合があります。たとえば、以下のビューは保存されているファンクション
        f() を起動します。
      
CREATE VIEW v AS SELECT * FROM t WHERE t.id = f(t.name);
        f()
        にこのようなステートメントが含まれているとします。
      
IF name IS NULL then CALL p1(); ELSE CALL p2(); END IF;
        f()
        を実行するとき、f()
        の中でステートメントの実行に要する権限を確認する必要があります。これは、f()
        中の実行パスによって、p1()
        または p2()
        に対する権限を確認する必要があることを意味します。これらの権限は実行時に確認する必要があり、その権限を所有している必要のあるユーザーは、ビュー
        v と関数
        f() の
        SQL SECURITY
        値によって決定されます。
      
        ビューに対する DEFINER
        節および SQL SECURITY
        節は標準 SQL の拡張子です。標準 SQL
        では、ビューは SQL SECURITY
        INVOKER.に対する規則を使って処理されます。
      
        MySQL 5.1.2
        より前に作成されたビューを呼び出すと、そのビューは、SQL
        SECURITY DEFINER
        節および使用しているアカウントと同じ
        DEFINER
        値を使用して作成されたものとして処理されます。しかし、実際の定義子が未知なので、MySQL
        は警告を発行します。警告を撤去するには、ビューを再び生成させて、ビュー定義に
        DEFINER
        節を含めれば十分です。
      
        オプションの ALGORITHM
        節は標準 MySQL の拡張子です。この節は、MySQL
        によるビューの処理方法に影響を与えます。ALGORITHM
        には 3
        つの値が付いています:MERGE、TEMPTABLE
        または
        UNDEFINED。ALGORITHM
        節がある場合、デフォルトアルゴリズムは
        UNDEFINED
        となります。詳細は View Processing Algorithms
        をご覧ください。
      
        幾つかのビューは更新可能です。すなわち、基礎をなすテーブルの内容を更新するため、UPDATE、DELETE
        または INSERT
        のようなステートメントの中でそれらを使うことができます。ビューを更新可能にするため、ビュー中の行と基礎テーブル中の行の間に
        1 対 1
        の関係が存在しなければなりません。また、ビューを更新不可能にするその他の特定の構造構文も存在します。
      
        それに対する select_statement
        中の WHERE
        節が真実であるものを除く行に、更新不能なビューが挿入されるか、当該行が更新されるのを回避するため、WITH
        CHECK OPTION
        節を附与することができます。
      
        更新可能なビューに対する
        WITH CHECK OPTION
        節に基づき、LOCAL と
        CASCADED
        キーワードはビューがほかのビューに対して定義される場合、チェックテストのスコープを決めます。定義されているビューだけに対して、LOCAL
        キーワードは CHECK
        OPTION
        を制限します。CASCADED
        は同様に基礎ビューを評価する確認を起動させます。キーワードが附与されない場合、デフォルト設定は
        CASCADED となります。
      
        更新可能なビューおよび WITH
        CHECK OPTION
        節の詳細については、Updatable and Insertable Views
        を参照してください。
      

