

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# CREATE VIEW
<a name="r_CREATE_VIEW"></a>

在数据库中创建一个视图。视图实际上不是具体化的；每当查询中引用视图时，系统都会运行定义视图的查询。要使用外部表创建视图，请包括 WITH NO SCHEMA BINDING 子句。

要创建标准视图，您需要对基础表或基础视图的访问权限。要查询标准视图，您需要选择针对视图本身的权限，但不需要选择针对基础表的权限。如果您创建的视图引用了其他架构中的表或视图，或者创建的视图引用了实体化视图，则需要使用权限。要查询后期绑定视图，您需要选择针对后期绑定视图本身的权限。您还应该确定后期绑定视图的所有者具有对引用的对象（表、视图或用户定义的函数）的选择权限。有关后期绑定视图的更多信息，请参阅[使用说明](#r_CREATE_VIEW_usage_notes)。

## 所需的权限
<a name="r_CREATE_VIEW-privileges"></a>

要使用 CREATE VIEW，需要以下权限之一。
+ 要使用 CREATE [ OR REPLACE ] VIEW 创建视图，请执行以下操作：
  + Superuser
  + 具有 CREATE [ REPLACE ] VIEW 权限的用户
+ 要使用 CREATE OR REPLACE VIEW 替换现有视图，请执行以下操作：
  + Superuser
  + 具有 CREATE [ OR REPLACE ] VIEW 权限的用户
  + 视图拥有者

如果用户想要访问包含用户定义函数的视图，则用户必须具有该函数的 EXECUTE 权限。

## 语法
<a name="r_CREATE_VIEW-synopsis"></a>

```
CREATE [ OR REPLACE ] VIEW name [ ( column_name [, ...] ) ] AS query
[ WITH NO SCHEMA BINDING ]
```

## 参数
<a name="r_CREATE_VIEW-parameters"></a>

OR REPLACE   
如果存在同名视图，则将替换视图。您只能将视图替换为生成相同的列集的新查询（使用相同的列名和数据类型）。CREATE OR REPLACE VIEW 将锁定视图以阻止读取和写入，直至操作完成。  
替换视图时，将保留它的其他属性（如所有权和授予的权限）。

 *名称*   
视图的名称。如果提供 schema 名称（例如，`myschema.myview`），则使用指定 schema 创建视图。否则，将在当前 schema 中创建视图。视图名称必须与同一 schema 中任何其他视图或表的名称不同。  
如果指定以“\$1”开头的视图名称，则视图创建为仅在当前会话中可见的临时视图。  
有关有效名称的更多信息，请参阅[名称和标识符](r_names.md)。您无法在系统数据库 template0、template1、padb\$1harvest 或 sys:internal 中创建表或视图。

 *column\$1name*   
要用于视图中的列的名称的可选列表。如果未提供列名，则从查询派生列名。可在单个视图中定义的列的最大数目为 1,600。

 *query*   
计算结果为表的查询（采用 SELECT 语句的形式）。此表定义视图中的列和行。

 WITH NO SCHEMA BINDING   
指定视图未绑定到基础数据库对象（例如表和用户定义的函数）的子句。因此，视图与其引用的对象之间不存在依赖关系。即使引用的对象不存在，您也可以创建视图。由于不存在依赖关系，删除或更改引用的对象不会影响视图。在查询视图之前，Amazon Redshift 不会检查依赖关系。后期绑定视图不支持递归公用表表达式（rCTE）。要查看有关后期绑定视图的详细信息，请运行 [PG\$1GET\$1LATE\$1BINDING\$1VIEW\$1COLS](PG_GET_LATE_BINDING_VIEW_COLS.md) 函数。  
在包括 WITH NO SCHEMA BINDING 子句时，必须使用 schema 名称来限定 SELECT 语句中引用的表和视图。创建视图时，即使引用的表不存在，schema 也必须存在。例如，以下语句将返回错误。  

```
create view myevent as select eventname from event
with no schema binding;
```
以下语句将成功运行。  

```
create view myevent as select eventname from public.event
with no schema binding;
```

**注意**  
无法从视图进行更新、插入或删除操作。

## 使用说明
<a name="r_CREATE_VIEW_usage_notes"></a>



### 后期绑定视图
<a name="r_CREATE_VIEW_late-binding-views"></a>

后期绑定视图不检查基础数据库对象（如表和视图），直至该视图被查询为止。因此，您可以修改或删除基础对象，而不必删除和重新创建视图。如果您删除了基础对象，对后期绑定视图的查询将失败。如果对后期绑定视图的查询引用了基础对象中不存在的列，查询将失败。

 如果您删除然后重新创建了后期绑定视图的基础表或视图，将使用默认访问权限创建新对象。您可能需要为将查询视图的用户授予对基础对象的权限。

要创建后期绑定视图，请加入 WITH NO SCHEMA BINDING 子句。以下示例创建一个没有 schema 绑定的视图。

```
create view event_vw as select * from public.event
with no schema binding;
```

```
select * from event_vw limit 1;
            
eventid | venueid | catid | dateid | eventname     | starttime
--------+---------+-------+--------+---------------+--------------------
      2 |     306 |     8 |   2114 | Boris Godunov | 2008-10-15 20:00:00
```

以下示例显示您可以修改基础表，而不必重新创建视图。

```
alter table event rename column eventname to title;
```

```
select * from event_vw limit 1;
            
eventid | venueid | catid | dateid | title         | starttime
--------+---------+-------+--------+---------------+--------------------
      2 |     306 |     8 |   2114 | Boris Godunov | 2008-10-15 20:00:00
```

您只能在后期绑定视图中引用 Amazon Redshift Spectrum 外部表。后期绑定视图的一种应用是查询 Amazon Redshift和 Redshift Spectrum 表。例如，您可以使用 [UNLOAD](r_UNLOAD.md) 命令将较旧的数据归档至 Amazon S3 。然后，创建一个 Redshift Spectrum 外部表，该表引用 Amazon S3 中的数据并创建一个可查询这两个表的视图。以下示例使用 UNION ALL 子句来联接 Amazon Redshift `SALES` 表和 Redshift Spectrum `SPECTRUM.SALES` 表。

```
create view sales_vw as
select * from public.sales
union all
select * from spectrum.sales
with no schema binding;
```

有关创建 Redshift Spectrum 外部表（包括 `SPECTRUM.SALES` 表）的更多信息，请参阅[Amazon Redshift Spectrum 入门](c-getting-started-using-spectrum.md)。

**重要**  
从后期绑定视图创建标准视图时，标准视图的定义包含创建标准视图时后期绑定视图的定义，包括后期绑定视图的拥有者。如果您在底层的后期绑定视图中进行了更改，则在重新创建标准视图之前，这些更改不会在标准视图中使用。因此，当查询标准视图时，它将始终使用后期绑定视图的定义和后期绑定视图的拥有者在创建标准视图时进行权限检查。

要更新标准视图以引用后期绑定视图的最新定义，请使用创建标准视图时使用的初始视图定义运行 CREATE OR REPLACE VIEW。

请参阅以下示例，了解如何从后期绑定视图中创建标准视图。

```
create view sales_vw_lbv as 
select * from public.sales 
with no schema binding;

show view sales_vw_lbv;
                            Show View DDL statement
--------------------------------------------------------------------------------
 create view sales_vw_lbv as select * from public.sales with no schema binding;
(1 row)

create view sales_vw as 
select * from sales_vw_lbv;

show view sales_vw;
                                               Show View DDL statement
---------------------------------------------------------------------------------------------------------------------
 SELECT sales_vw_lbv.price, sales_vw_lbv."region" FROM (SELECT sales.price, sales."region" FROM sales) sales_vw_lbv;
(1 row)
```

请注意，标准视图的 DDL 语句中所示的后期绑定视图是在创建标准视图时定义的，并且不会随着您之后对后期绑定视图所做的任何更改而更新。

## 示例
<a name="r_CREATE_VIEW-examples"></a>

示例命令使用一组名为 *TICKIT* 数据库的对象和数据示例。有关更多信息，请参阅[示例数据库](https://docs.aws.amazon.com/redshift/latest/dg/c_sampledb.html)。

以下命令从名为 EVENT 的表创建一个名为 *myevent* 的视图。

```
create view myevent as select eventname from event
where eventname = 'LeAnn Rimes';
```

以下命令从名为 USERS 的表创建一个名为* myuser* 的视图。

```
create view myuser as select lastname from users;
```

以下命令从名为 USERS 的表创建或替换一个名为* myuser* 的视图。

```
create or replace view myuser as select lastname from users;
```

以下示例创建一个没有 schema 绑定的视图。

```
create view myevent as select eventname from public.event
with no schema binding;
```