视图(View)是在表之上建立的虚拟表,它的结构和内容都来自表。一个视图可以对应一个表或多个表。如果您想保留查询结果,但不想创建表占用存储,可以通过视图实现。

视图操作命令如下。

类型 功能 角色 操作入口
创建或更新视图 基于查询语句创建视图或更新已存在的视图。 具备项目空间创建表权限(CreateTable)的用户。 本文中的命令您可以在如下工具平台执行:
重命名视图 修改已创建视图的名称。 具备修改表权限(Alter)的用户。
查看视图 查看已创建的视图的信息。 具备读取表元信息权限(Describe)的用户。
删除视图 删除已创建的视图。 具备删除表权限(Drop)的用户。

创建或更新视图

基于查询语句创建视图或更新已存在的视图。

  • 使用限制
    • 视图可以引用其它视图,但不能引用自己,也不能循环引用。
    • 不允许向视图写入数据,例如使用insert into或者insert overwrite操作视图。
  • 命令格式
    create [or replace] view [if not exists] <view_name>
        [(<col_name> [comment <col_comment>], ...)]
        [comment <view_comment>]
        as <select_statement>;
  • 参数说明
    • or replace:可选。更新视图需要携带该字段。
    • if not exists:可选。如果没有指定if not exists,在视图已经存在时用create view会导致异常。这种情况可以用create or replace view重建视图,重建后视图本身的权限保持不变。
    • view_name:必填。待创建或更新的视图的名称。
    • col_name:必填。待创建视图包含的列名称。
    • col_comment:可选,待创建视图的列的注释。
    • view_comment:可选。待创建视图的注释。
    • select_statement:必填。select查询语句,是视图的数据来源,您必须有视图所引用表的读权限。视图只能包含一个有效的select语句。
      说明 创建或更新好视图后,如果视图引用的表发生了变更,有可能导致视图无法访问,例如删除了引用的表。您需要自行维护引用表及视图之间的对应关系。
  • 使用示例
    • 示例1:基于表sale_detail创建视图sale_detail_view。
      create view if not exists sale_detail_view
      (store_name, customer_id, price, sale_date, region)
      comment 'a view for table sale_detail'
      as select * from sale_detail;
    • 示例2:基于表sale_detail更新视图sale_detail_view。
      create or replace view if not exists sale_detail_view
      (store_name, customer_id, price)
      comment 'a view for table sale_detail'
      as select shop_name, customer_id, total_price from sale_detail;

重命名视图

修改已创建视图的名称。

  • 命令格式
    alter view <view_name> rename to <new_view_name>;
  • 参数说明
    • view_name:需要重命名视图的名称。
    • new_view_name:新的视图名称。如果已存在同名视图,会返回报错。
  • 使用示例
    --将视图view sale_detail_view重命名为market。
    alter view sale_detail_view rename to market;

查看视图

命令详情请参见查看表或视图信息

删除视图

删除已创建的视图。

  • 命令格式
    drop view [if exists] <view_name>;
  • 参数说明
    • if exists:如果视图不存在且没有指定if exists,会返回报错。
    • view_name:待删除的视图的名称。
  • 使用示例
    --删除视图sale_detail_view。
    drop view if exists sale_detail_view;