重要
このページは英語版のページを機械翻訳しています。原文はこちらからご覧ください。

ビュー

このドキュメントでは、TiDBでビューを使用する方法について説明します。

概要

TiDBはビューをサポートします。ビューは仮想テーブルとして機能し、そのスキーマはビューを作成するSELECTステートメントによって定義されます。

  • ビューを作成して、安全なフィールドとデータのみをユーザーに公開できます。これにより、基になるテーブル内の機密フィールドとデータのセキュリティが確保されます。
  • 複雑なクエリをより簡単かつ便利にするために頻繁に使用される複雑なクエリのビューを作成できます。

ビューを作成する

TiDBでは、複雑なクエリをCREATE VIEWステートメントのビューとして定義できます。構文は次のとおりです。

CREATE VIEW view_name AS query;

既存のビューまたはテーブルと同じ名前のビューを作成することはできないことに注意してください。

たとえば、 マルチテーブル結合クエリは、 JOINステートメントを介してbooksテーブルとratingsテーブルを結合することにより、平均評価のある本のリストを取得します。

後続のクエリの便宜のために、次のステートメントを使用してクエリをビューとして定義できます。

CREATE VIEW book_with_ratings AS
SELECT b.id AS book_id, ANY_VALUE(b.title) AS book_title, AVG(r.score) AS average_score
FROM books b
LEFT JOIN ratings r ON b.id = r.book_id
GROUP BY b.id;

クエリビュー

ビューが作成されると、 SELECTステートメントを使用して、通常のテーブルと同じようにビューをクエリできます。

SELECT * FROM book_with_ratings LIMIT 10;

TiDBがビューを照会するとき、ビューに関連付けられたSELECTのステートメントを照会します。

ビューを更新する

現在、TiDBのビューはALTER VIEW view_name AS query;をサポートしていません。次の2つの方法でビューを「更新」できます。

  • DROP VIEW view_name;ステートメントで古いビューを削除してから、 CREATE VIEW view_name AS query;ステートメントで新しいビューを作成してビューを更新します。
  • CREATE OR REPLACE VIEW view_name AS query;ステートメントを使用して、同じ名前の既存のビューを上書きします。
CREATE OR REPLACE VIEW book_with_ratings AS
SELECT b.id AS book_id, ANY_VALUE(b.title), ANY_VALUE(b.published_at) AS book_title, AVG(r.score) AS average_score
FROM books b
LEFT JOIN ratings r ON b.id = r.book_id
GROUP BY b.id;

SHOW CREATE TABLE|VIEW view_nameステートメントの使用

SHOW CREATE VIEW book_with_ratings\G

結果は次のとおりです。

*************************** 1. row ***************************
                View: book_with_ratings
         Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`%` SQL SECURITY DEFINER VIEW `book_with_ratings` (`book_id`, `ANY_VALUE(b.title)`, `book_title`, `average_score`) AS SELECT `b`.`id` AS `book_id`,ANY_VALUE(`b`.`title`) AS `ANY_VALUE(b.title)`,ANY_VALUE(`b`.`published_at`) AS `book_title`,AVG(`r`.`score`) AS `average_score` FROM `bookshop`.`books` AS `b` LEFT JOIN `bookshop`.`ratings` AS `r` ON `b`.`id`=`r`.`book_id` GROUP BY `b`.`id`
character_set_client: utf8mb4
collation_connection: utf8mb4_general_ci
1 row in set (0.00 sec)

INFORMATION_SCHEMA.VIEWSテーブルをクエリします

SELECT * FROM information_schema.views WHERE TABLE_NAME = 'book_with_ratings'\G

結果は次のとおりです。

*************************** 1. row ***************************
       TABLE_CATALOG: def
        TABLE_SCHEMA: bookshop
          TABLE_NAME: book_with_ratings
     VIEW_DEFINITION: SELECT `b`.`id` AS `book_id`,ANY_VALUE(`b`.`title`) AS `ANY_VALUE(b.title)`,ANY_VALUE(`b`.`published_at`) AS `book_title`,AVG(`r`.`score`) AS `average_score` FROM `bookshop`.`books` AS `b` LEFT JOIN `bookshop`.`ratings` AS `r` ON `b`.`id`=`r`.`book_id` GROUP BY `b`.`id`
        CHECK_OPTION: CASCADED
        IS_UPDATABLE: NO
             DEFINER: root@%
       SECURITY_TYPE: DEFINER
CHARACTER_SET_CLIENT: utf8mb4
COLLATION_CONNECTION: utf8mb4_general_ci
1 row in set (0.00 sec)

ビューをドロップ

ビューを削除するには、 DROP VIEW view_name;ステートメントを使用します。

DROP VIEW book_with_ratings;

制限

TiDBのビューの制限については、 ビューの制限を参照してください。

続きを読む