ビュー
このドキュメントでは、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 のビューの制限については、 ビューの制限参照してください。