# 视图

> 在 SQL 中，视图是基于 SQL 语句的结果集的可视化的表，是一个虚拟表。与物理表一样，视图包含行和列，视图中的字段就是来自一个或多个数据库中的真实的表中的字段。在视图中可以使用 select 语句查询数据，以及使用 insert、update、delete 语句修改记录，对于视图的操作最终转化为对基本数据表的操作。视图不仅可以方便操作，而且可以保障数据库系统的安全性。

测试数据 employees 表

![](./static/images/05_01.png)

## 创建视图

```sql
--创建视图
create view employees_view
as
select number, name, age from employees where age is not null
```

> 注意：
>
> 1、在视图中最多只能引用1024列，视图中记录的数目限制只由其基表中的记录数决定。
>
> 2、如果视图引用中的基表或者视图被删除，则该视图不能再被使用，直到创建新的基表或者视图。
>
> 3、如果视图中某一列是函数、数学表达式、常量或者来自多个表的列名相同，则必须为列定义名称。
>
> 4、不能在视图上创建索引，不能再规则、默认、触发器的都定义中引用视图。
>
> 5、当通过视图查询数据时，SQL Server 要检查以确保语句中涉及的所有数据库对象存在，每个数据库对象在语句的上下文中有效，而且数据修改语句不能违反数据完整性规则。
>
> 6、视图的名称必须遵循标识符的规则，且对每个用户必须是唯一的。此外，该名称不得与该用户拥有的任何表的名称相同。

```sql
--查询视图
select * from employees_view;
```

![](./static/images/07_01.png)

## 更新视图

```sql
insert into employees_view values('11080306', '胡大海', 34, 3818.38, '2000-12-01 15:38:00.000')
```

结果：

![](./static/images/07_02.png)

> 注意：
>
> 1、修改视图中的数据时，不能同时修改两个或者多个基表，可以对基于两个或多个基表或者视图的视图进行修改，但是每次修改都只能影响一个基表。
>
> 2、不能修改那些通过计算得到的字段，例如包含计算值或者合计函数的字段。
>
> 3、如果在创建视图时指定了 with check option 选项，那么使用视图修改数据库信息时，必须保证修改后的数据满足视图定义的范围。
>
> 4、执行 update、delete 命令时，所删除与更新的数据必须包含在视图的结果集中。
>
> 5、如果视图引用多个表时，无法用 delete 命令删除数据，若使用 update 命令则应与 insert 操作一样，被更新的列必须属于同一个表。

## 撤销视图

```sql
drop view employees_view
```

> 语法说明：
>
> 1、只有视图拥有者或者有 DBA 权限的用户才能删除视图。
>
> 2、删除视图不会影响基本表中的数据，但与该视图有关的所有授权将被自动撤销。
>
> 3、如果该视图被其他视图引用，则删除了该视图后，虽然引用视图依然存在，但将不能正常运行。