視圖(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>');