视图(View)是一个虚拟的表,其内容由SQL查询定义,视图可以封装复杂的查询逻辑,使得可以通过查询简单的视图来获取复杂的结果集。Hologres支持基于内部表及外部表创建VIEW,您可以使用单张表、多张表或者其他视图来创建视图。本文为您介绍在Hologres中创建视图命令说明及相关操作。
注意事项
在创建和查看视图时,您需要注意如下事项:
如果数据库的权限模型为SLPM,创建一个View引用了跨Schema的两个或多个表时,由于Schema间权限不互通的原因,此View将无法被访问。因此不建议在SLPM管理的数据库中创建跨Schema的View。
如果视图中数据来自于单张表时,修改视图中的数据,表数据会随之更新。修改表数据时,对应视图也会更新。在使用单表视图时,建议您谨慎修改视图数据,以避免对应的表数据被修改影响业务。
如果视图中的数据来源于多张表时,不支持修改视图数据。
命令格式
创建视图的语法格式如下。
CREATE VIEW <view_name> AS
SELECT column1, column2.....
FROM table_name
WHERE [condition];
view_name为视图名称,SELECT ...
语句为查询语句。
使用示例
创建内部表视图
创建内部表,示例语句如下。
create table holo_test ( amount decimal(10, 2), rate decimal(10, 2) ); insert into holo_test values (12.12,13.13), (14.14,15.15), (16.16,17.17), (17.1,17), (18.01,19);
基于内部表创建视图并查询表数据,示例语句如下。
create view holo_view as select * from holo_test; select * from holo_view; amount | rate --------+------- 12.12 | 13.13 14.14 | 15.15 16.16 | 17.17 17.10 | 17.00 18.01 | 19.00 (5 rows)
创建外部表视图
创建外部表,示例语句如下。
create foreign table if not exists holo_foreign_test ( amount decimal(10, 2), rate decimal(10, 2)) server odps_server options(project_name '<projectname>', table_name '<odps_name>') ); select * from holo_foreign_test limit 2;
基于外部表创建视图并查询表数据,示例语句如下。
create view foreign_view as select * from holo_foreign_test; select * from foreign_view limit 2; amount | rate --------+------- 12.12 | 13.13 14.14 | 15.15
创建内部表及外部表的联合视图
基于内部表和外部表创建联合视图并查询表数据,示例语句如下。
create view view1 as select * from holo_view union all select * from foreign_view;
select * from view1;
amount | rate
--------+-------
12.12 | 13.13
14.14 | 15.15
16.16 | 17.17
17.1 | 17
18.01 | 19
12.12 | 13.13
14.14 | 15.15
16.16 | 17.17
17.10 | 17.00
18.01 | 19.00
12.12 | 13.13
14.14 | 15.15
16.16 | 17.17
17.1 | 17
18.01 | 19
12.12 | 13.13
14.14 | 15.15
16.16 | 17.17
17.1 | 17
18.01 | 19
(20 rows)
其他相关操作
修改视图名称
Hologres从V2.1.18版本起支持修改视图名称,命令语法如下:
ALTER VIEW <view_name_1> RENAME TO <view_name_2>;
删除视图
删除视图的命令语法如下。
DROP VIEW <view_name>;
查看所有视图和视图的DDL
您可以执行如下命令查看所有视图,如果您通过psql客户端查看所有视图,也可以执行
\dv
进行查看。--sql命令 SELECT n.nspname as "Schema", c.relname as "Name", CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'm' THEN 'materialized view' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 's' THEN 'special' WHEN 'f' THEN 'foreign table' WHEN 'p' THEN 'table' WHEN 'I' THEN 'index' END as "Type", pg_catalog.pg_get_userbyid(c.relowner) as "Owner" FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relkind IN ('v','') AND n.nspname <> 'pg_catalog' AND n.nspname <> 'information_schema' AND n.nspname !~ '^pg_toast' AND pg_catalog.pg_table_is_visible(c.oid) ORDER BY 1,2;
您可以执行如下命令查看VIEW的具体DDL:
create extension hg_toolkit; select hg_dump_script('<viewname>');