すべてのプロダクト
Search
ドキュメントセンター

AnalyticDB:CREATE VIEW

最終更新日:Sep 17, 2026

ビューは、1 つ以上のテーブルに対するクエリの結果から構築される仮想テーブルです。実際のデータは格納しません。ビューを使用すると、複雑なクエリを簡素化し、データセキュリティを強化できます。このトピックでは、CREATE VIEW ステートメントを使用してビューを作成する方法について説明します。

注意事項

AnalyticDB for MySQL のビューの動作は、MySQL のビューの動作と互換性があり、以下のとおりです。

  • 3.1.9.0 より前のバージョン

    AnalyticDB for MySQL クラスターは、MySQL のデフォルトの動作をサポートしていません。ビューの列を追加または削除した後、SELECT * FROM <view_name>; を使用してビューにクエリを実行すると、その動作は MySQL とは一致しません。システムは列数の不一致を検出し、ビューが利用不可であると判断します。この場合、次のエラーが返されます: View '<view_name>' is stale; it must be re-created。

  • V3.1.9.0 以降

    AnalyticDB for MySQL クラスターは、MySQL のデフォルトの動作をサポートしています。ビューを作成する際、クラスターは SQL ステートメント内の * を明示的な列に展開してから、その SQL ステートメントを保存します。その後、列を追加または削除しても、ビューは影響を受けなくなります。

したがって、V3.1.9.0 以降を実行するクラスターを使用してビューを作成することを推奨します。これにより、MySQL のデフォルト動作との互換性が確保され、ビューで * を使用することによって引き起こされる予期しないセマンティクスやエラーを回避できます。

説明

Data Lakehouse Edition クラスターのマイナーバージョンを表示するには、SELECT adb_version(); を実行します。マイナーバージョンをアップグレードするには、テクニカルサポートにお問い合わせください。

V3.1.9.0 以降を実行し、MySQL の動作と互換性がある AnalyticDB for MySQL クラスターでは、特殊なケースで副作用が発生する可能性があります。 たとえば、列の名前を C から D に変更し、ビューが列 A、B、および C を正確に参照する必要がある場合、列 C が存在しなくなるため、ビューは使用不可になり、エラーが返されます。 これは想定どおりの動作です。 列プルーニングは最適化フェーズで行われるのに対し、SQL 構文チェックと権限検証は解析フェーズで行われるため、クエリが最終的に列 C を使用しない場合でもエラーが返されます。 しかし、3.1.9.0 より前のバージョンでは、ビューの列数のみがチェックされ、その数は名前変更操作後も同じままであり、現在の * によって参照される列数も一貫しているため、すべてのチェックに合格し、エラーは返されません。 ビューの可用性チェックに合格すると、列 C はベーステーブルの順序で 3 番目の列にマッピングされます。 名前変更操作後に列 C をクエリしてもエラーは返されず、クエリ結果は予期しないものになります。

3.1.9.0 より前のバージョンを実行する AnalyticDB for MySQL クラスターの特殊な動作が業務で必要な場合は、ビューの作成時に特定のヒントを追加するか、設定を構成することで、期待される動作を実現できます。

  • 単一のビューを設定するには、/*+LOG_VIEW_SELECT_ASTERISK_MYSQL_MODE=false*/ を追加します。次の例は、ヒントの追加方法を示しています:

    /*+LOG_VIEW_SELECT_ASTERISK_MYSQL_MODE=false*/
    CREATE VIEW v0
    AS
    SELECT * FROM base0;
  • クラスター内のすべてのビューを設定するには、次のステートメントを実行します: SET ADB_CONFIG LOG_VIEW_SELECT_ASTERISK_MYSQL_MODE = false;

構文

CREATE
[OR REPLACE]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name
AS select_statement;

パラメーター

必須

説明

OR REPLACE

いいえ

同じ名前のビューが存在するかどうかに応じて、次のルールでビューを作成します:

  • 同じ名前のビューが存在しない場合、AnalyticDB for MySQL は新しいビューを直接作成します。

  • 同じ名前のビューが存在する場合、AnalyticDB for MySQL は既存のビューを削除し、新しいビューを作成します。

説明

このパラメーターが指定されておらず、同じ名前のビューが存在する場合、ビューの作成は失敗します。

[SQL SECURITY]

ビューのデータをクエリするときに使用されるセキュリティ検証メソッドです。有効な値は次のとおりです:

  • INVOKER: INVOKER (呼び出し元) としてクエリ SQL ステートメントを実行します。

    このセキュリティ検証メソッドでは、ビューのデータがクエリされるときに、呼び出し元が次の権限を持っているかどうかが検証されます:

    • ビューに対するクエリ権限。

    • ビューによって参照されるオブジェクトに対するクエリ権限。

    呼び出し元が両方の権限を持っている場合にのみ、ビューのデータをクエリできます。

  • DEFINER: DEFINER (定義者) としてクエリ SQL ステートメントを実行します。

    このセキュリティ検証メソッドでは、ビューのデータがクエリされるときに、呼び出し元と定義者が次の権限を持っているかどうかが検証されます:

    • 呼び出し元はビューに対するクエリ権限を持っています。

    • 定義者はビューによって参照されるオブジェクトに対するクエリ権限を持っています。

    定義者の権限が取り消されると、呼び出し元がビューに対するクエリ権限を持っていても、ビューはクエリできなくなります。

説明
  • このパラメーターが指定されていない場合、AnalyticDB for MySQL は、デフォルトで INVOKER セキュリティ検証方法を使用します。この場合、呼び出し元には、ビューに対するクエリ権限と、ビューによって参照されるオブジェクトに対するクエリ権限の両方が必要です。

  • このパラメーターは、V3.1.4.0 以降を実行する AnalyticDB for MySQL クラスターでのみサポートされています。 クラスターのマイナーバージョンを表示するには、「インスタンスのバージョン情報を表示する方法」をご参照ください。 マイナーバージョンをアップグレードするには、テクニカルサポートにお問い合わせください。

view_name

はい

ビューの名前。

説明

ビュー名の前に adb_demo.view のようにデータベース名を追加して、ビューが属するデータベースを指定することもできます。データベース名を追加しない場合、ビューはデフォルトで現在のデータベースに属します。

select_statement

ビューのデータソース。

例

  • テストデータの準備

    AnalyticDB for MySQL クラスターの特権アカウントを使用して、次の操作を実行します:

    1. user1 という名前のアカウントを作成します:

      CREATE USER user1 IDENTIFIED BY 'user1_pwd';
    2. adb_demo という名前のデータベースと、そのデータベース内に t1 という名前のテーブルを作成します。次のステートメントは、t1 テーブルを作成します:

      Create Table `t1` (
       `id` bigint AUTO_INCREMENT,
       `id_province` bigint NOT NULL,
       `user_info` varchar,
       primary key (`id`)
      ) DISTRIBUTED BY HASH(`id`);

      t1 テーブルにテストデータを挿入します:

      INSERT INTO t1(id_province,user_info) VALUES (1,'Tom'),(1,'Jerry'),(2,'Jerry'),(3,'Mark');
  • ビューの作成

    説明

    次の例では、t1 テーブルを基に異なるセキュリティ検証メソッドでビューを作成し、DEFINER と INVOKER における権限の違いを説明します。

    • v1 という名前のビューを作成し、SQL SECURITY を INVOKER に設定するには、次のステートメントを実行します:

      CREATE SQL SECURITY INVOKER VIEW v1
        AS SELECT id_province,user_info FROM t1 WHERE id_province=1;
    • v2 という名前のビューを作成し、SQL SECURITY を DEFINER に設定するには、次のステートメントを実行します:

      CREATE SQL SECURITY DEFINER VIEW v2
        AS SELECT id_province,user_info FROM t1 WHERE id_province=1;
    • v3 という名前のビューを SQL SECURITY を指定せずに作成する (この場合、システムはデフォルトで INVOKER を使用します) には、次のステートメントを実行します:

      CREATE VIEW v3
        AS SELECT id_province,user_info FROM t1 WHERE id_province=1;
  • 権限の比較

    • 特権アカウントを使用して、3 つのビューをクエリする権限のみを user1 に付与します:

      GRANT SELECT ON adb_demo.v1 TO 'user1'@'%';
      GRANT SELECT ON adb_demo.v2 TO 'user1'@'%';
      GRANT SELECT ON adb_demo.v3 TO 'user1'@'%';

      この場合、user1 は AnalyticDB for MySQL クラスターの adb_demo データベースに接続した後、v2 ビューのみをクエリできます。 クエリ文:

      SELECT * FROM v2;

      次の結果が返されます:

      +-------------+-----------+
      | ID_PROVINCE | USER_INFO |
      +-------------+-----------+
      |           1 | Tom       |
      |           1 | Jerry     |
      +-------------+-----------+

      ただし、user1 が v1 または v3 ビューをクエリすると、エラーが返されます。クエリステートメント:

      SELECT * FROM v1

      または

      SELECT * FROM v3

      どちらのステートメントも次のエラーを返します:

      ERROR 1815 (HY000): [20049, 2021083110261019216818804803453927668] : Failed analyzing stored view
    • user1 に 3 つのビューをクエリする権限を付与した後、特権アカウントを使用して user1 に t1 テーブルをクエリする権限を付与します:

      GRANT SELECT ON adb_demo.t1 to user1@'%';

      この場合、user1 が AnalyticDB for MySQL クラスターの adb_demo データベースに接続すると、user1 はすべての v1、v2、および v3 ビューをクエリできます。 クエリ文:

      SELECT * FROM v1;

      または

      SELECT * FROM v2;

      または

      SELECT * FROM v3;

      3 つのクエリステートメントはすべて同じ結果を返します:

      +-------------+-----------+
      | ID_PROVINCE | USER_INFO |
      +-------------+-----------+
      |           1 | Tom       |
      |           1 | Jerry     |
      +-------------+-----------+

よくある質問

ベーステーブルで小文字で定義された列名が、ビューの結果セットで大文字で表示されるのはなぜですか?

AnalyticDB for MySQL のビュー結果セットの列名は、デフォルトでは大文字と小文字が区別されません。ビュー結果セットの列名を小文字にしたい場合は、VIEW_OUTPUT_NAME_CASE_SENSITIVE の値を true に設定して、大文字と小文字を区別するように指定できます。そのためには、次のステートメントを実行します。

SET ADB_CONFIG VIEW_OUTPUT_NAME_CASE_SENSITIVE=true;

ベストプラクティス

詳細については、「ビューを使用した権限管理」をご参照ください。