逻辑视图
逻辑视图
1. 功能概述
IoTDB 支持创建逻辑视图,将一段查询语句保存为可复用的视图。后续可以像查询普通表一样查询逻辑视图,从而减少重复编写复杂 SQL 的工作量,并为应用提供统一的查询入口。
逻辑视图只保存查询语句,不复制或持久化查询结果。每次查询逻辑视图时,IoTDB 会执行视图中保存的查询语句,并返回查询结果。
注意:自 V2.0.11.1 起支持该功能。
2. 功能介绍
2.1 创建逻辑视图
2.1.1 语法定义
CREATE [OR REPLACE] VIEW qualifiedName
[COMMENT string]
AS query2.1.2 语法说明
1. qualifiedName
逻辑视图名称,与表名使用相同的[命名规则](../Basic-Concept/Table-Management_apache.md#_2-1-创建表)。若当前会话已使用某个数据库,可以直接指定视图名;否则需要使用带数据库名的完整视图名。
2. OR REPLACE
若指定 OR REPLACE,当同名逻辑视图已存在时,会使用新的查询语句覆盖原定义。
即使该逻辑视图已经被其他逻辑视图引用,也可以被替换。需要注意的是,如果替换后返回的列名、列数量或列类型发生变化,引用该视图的其他逻辑视图在查询时可能报错,此时需要同步调整相关视图。
3. COMMENT string
用于为逻辑视图添加注释。注释信息可通过元数据展示语句查看。
4. query
逻辑视图保存的查询语句。查询语句中可以引用以下内容:
普通表。
树转表视图。
可写视图。
其他逻辑视图。
注意:逻辑视图不允许循环引用。例如,视图
a引用视图b,同时视图b又直接或间接引用视图a,该类定义会被拒绝。
2.1.3 使用示例
以下示例基于[示例数据](../Reference/Sample-Data.md)中的 table1。该表包含 region、plant_id、device_id、temperature、humidity、status 等列。
- 基于普通表创建逻辑视图:
CREATE VIEW device_temperature_view AS
SELECT time, region, plant_id, device_id, temperature
FROM table1;- 基于另一个逻辑视图创建逻辑视图:
CREATE VIEW high_temperature_view AS
SELECT time, region, plant_id, device_id, temperature
FROM device_temperature_view
WHERE temperature >= 90.0;- 基于树转表视图创建逻辑视图:
CREATE VIEW treeView (
value FLOAT FIELD
)
AS root.test.**;
CREATE VIEW view_base_treeview AS
SELECT value
FROM treeView;- 基于可写视图创建逻辑视图:
CREATE WRITABLE VIEW table1_writable_view AS
SELECT temperature, humidity, status
FROM table1;
CREATE VIEW view_base_writableview AS
SELECT temperature, humidity
FROM table1_writable_view;- 循环引用示例:
CREATE VIEW a AS
SELECT time, region, plant_id, device_id, temperature
FROM table1;
CREATE VIEW b AS
SELECT * FROM a;
CREATE OR REPLACE VIEW a AS
SELECT * FROM b;上述语句会使视图 a 与视图 b 形成循环引用,因此执行失败:
Msg: org.apache.iotdb.jdbc.IoTDBSQLException: 701: Failed analyzing stored view 'b': Statement would create a recursive view2.2 修改逻辑视图
2.2.1 语法定义
逻辑视图支持修改视图名称,以及添加、覆盖或清除视图注释。
ALTER VIEW [IF EXISTS] viewName RENAME TO identifier
COMMENT ON VIEW qualifiedName IS (string | NULL)2.2.2 语法说明
使用
ALTER VIEW ... RENAME TO可以修改逻辑视图名称。使用
COMMENT ON VIEW可以修改逻辑视图注释。指定字符串时,会添加或覆盖注释;指定NULL时,会清除已有注释。
2.2.3 使用示例
ALTER VIEW IF EXISTS device_temperature_view RENAME TO temperature_view ;
COMMENT ON VIEW high_temperature_view IS 'high temperature view';
COMMENT ON VIEW high_temperature_view IS NULL;2.3 删除逻辑视图
2.3.1 语法定义
DROP VIEW [IF EXISTS] viewName2.3.2 使用示例
DROP VIEW IF EXISTS view_base_writableview;2.4 查看逻辑视图
2.4.1 语法定义
showViewStatement
: SHOW VIEWS ((FROM | IN) databaseName=identifier)? #showViews
| SHOW TABLES DETAILS ((FROM | IN) databaseName=identifier)? #showTablesDetails
| (DESC | DESCRIBE) viewName=qualifiedName DETAILS? #describeView
| SHOW CREATE (VIEW | TABLE) viewName=qualifiedName #showCreateView
;2.4.2 语法说明
SHOW VIEWS用于查看当前数据库下的视图。SHOW TABLES DETAILS会在结果集中通过TableType字段展示表或视图的类型。对于逻辑视图,TableType为VIEW。DESC <VIEW_NAME> DETAILS用于查看逻辑视图的列信息。SHOW CREATE VIEW和SHOW CREATE TABLE均可查看可写视图的创建语句。
2.4.3 使用示例
- 查看表和视图详情:
TimechoDB:database1> SHOW TABLES DETAILS FROM database1;
+-----------------------+-------+------+-------+--------------+-----------------+
| TableName|TTL(ms)|Status|Comment| TableType|OriginalTableName|
+-----------------------+-------+------+-------+--------------+-----------------+
| temperature_view| INF| USING| device| VIEW| null|
| table1| INF| USING| null| BASE TABLE| null|
| table1_view| INF| USING| null| WRITABLE VIEW| table1|
| treeview| INF| USING| null|VIEW FROM TREE| null|
+-----------------------+-------+------+-------+--------------+-----------------+
Total line number = 5
It costs 0.000s- 查看逻辑视图的列
TimechoDB:database1> desc temperature_view
+-----------+---------+--------+
| ColumnName| DataType|Category|
+-----------+---------+--------+
| time|TIMESTAMP| FIELD|
| region| STRING| FIELD|
| plant_id| STRING| FIELD|
| device_id| STRING| FIELD|
|temperature| FLOAT| FIELD|
+-----------+---------+--------+
Total line number = 5
It costs 0.020s- 查看逻辑视图的列详细信息:
TimechoDB:database1> desc temperature_view details
+-----------+---------+--------+------+-------+
| ColumnName| DataType|Category|Status|Comment|
+-----------+---------+--------+------+-------+
| time|TIMESTAMP| FIELD| USING| null|
| region| STRING| FIELD| USING| null|
| plant_id| STRING| FIELD| USING| null|
| device_id| STRING| FIELD| USING| null|
|temperature| FLOAT| FIELD| USING| null|
+-----------+---------+--------+------+-------+
Total line number = 5
It costs 0.032s- 查看逻辑视图创建语句:
TimechoDB:database1> SHOW CREATE VIEW device_temperature_view;
+----------------+-----------------------------------------------------------------------------------------------------------------+
| View| Create View|
+----------------+-----------------------------------------------------------------------------------------------------------------+
|temperature_view|CREATE VIEW "temperature_view" AS SELECT time , region , plant_id , device_id , temperature FROM database1.table1|
+----------------+-----------------------------------------------------------------------------------------------------------------+
Total line number = 1
It costs 0.026s注意:
SHOW CREATE VIEW仅支持视图,不支持普通表或INFORMATION_SCHEMA下的系统表。SHOW CREATE TABLE不支持INFORMATION_SCHEMA下的系统表。
不合法示例:
SHOW CREATE VIEW table1;
Msg: org.apache.iotdb.jdbc.IoTDBSQLException: 701: The table table1 is a base table, does not support show create view.
SHOW CREATE VIEW information_schema.tables;
Msg: org.apache.iotdb.jdbc.IoTDBSQLException: 701: The system view does not support show create.
SHOW CREATE TABLE information_schema.tables;
Msg: org.apache.iotdb.jdbc.IoTDBSQLException: 701: The system view does not support show create.3. 使用限制与注意事项
3.1 引用的表或视图变更
逻辑视图只保存查询定义,不会锁定其引用的表或视图。因此,被逻辑视图引用的表或视图仍然可以被 ALTER、DROP 或 REPLACE。
引用的表或视图发生变更后,查询逻辑视图可能出现以下异常:
引用的表或视图被删除时,查询逻辑视图会报错,提示对应表不存在。
引用的表或视图被删除后重新创建,或被
REPLACE后,若逻辑视图的实际查询结果与原定义不一致,查询逻辑视图会报错,提示该逻辑视图已过期或处于无效状态。
相关报错示例:
Table '%s' does not exist
View '%s' is stale or in invalid state: %s3.2 访问控制
逻辑视图相关权限要求如下:
执行
CREATE VIEW或CREATE OR REPLACE VIEW时,需要拥有目标视图或其所属数据库对应的CREATE权限;同时需要拥有所有被引用表或视图的SELECT权限。执行
ALTER VIEW时,需要拥有目标视图或其所属数据库对应的ALTER权限。执行
DROP VIEW时,需要拥有目标视图或其所属数据库对应的DROP权限。查询逻辑视图数据时,仅需要拥有该逻辑视图的
SELECT权限,不需要拥有被引用表或视图的SELECT权限。