11、SQL Server 基础 - 视图和公用表表达式

视图

视图是基于结果集的可视化的表,用于简化查询,对视图的操作不会影响到数据库本身。
①创建视图

CREATE VIEW 视图名 AS
SELECT 列名表
FROM 源表名

例如:

create view MyView as
select Cno,CName,Credit 
from Course

可以看到在视图中多了一个文件:
 
查看一下:
 

②删除视图

DROP VIEW 视图名

删除后可以刷新对象资源管理器看到视图已经被删除了。

③视图的更新

sp_refreshview 视图名

因为视图是基于表的,这相当于使用存储过程来刷新了视图。

**(1)**如果添加一个列,因为这个列必然不在视图创建时要求的列中(即便创建时使用了*,也只表示那个时候的全部,并不包括这个列),是不会对视图有影响的。
但是,如果你使用*的初衷不是为了只使用当前表中全部的列,还希望当表增加新的列时视图也能增加,这时候就需要去更新视图了。

create view MyView as
select * 
from Course

alter table Course add XinDe char(10)

sp_refreshview MyView

select * from MyView

 

**(2)**因为视图来自表,所以在表中删除了视图中使用了的列(这时候没问题,因为视图不影响表),在查看视图时会报错,即便查看的仅是没删除的列。这时候就需要刷新视图。

alter table Course drop column XinDe

select CName from MyView

 
刷新视图,去查看全部列也没问题了,这时的全部当然不会包括删掉的那个列。

sp_refreshview MyView

select * from MyView

 

**(3)**对于原表中的数据进行了更改,则视图会自动更新。

create view MyView as
select Cno,CName,Credit 
from Course

update Course set Credit=7 where Cno=1

select * from MyView

 

公用表表达式

前面学的视图是作为数据库对象存储在数据库中的,如果这个结果集仅仅要使用一次,那么建立视图就太奢侈了。
公用表表达式(Common Table Expression)将查询结果指定一个临时命名的名字。

WITH 公用表名 [(自定列名表)] AS
(SELECT...)

注意,公用表表达式只能且必须在后面的一个SELECT/INSERT/UPDATE/DELETE/MERGE语句中使用,但这条语句未结束时可以多次使用,结束后就失效了。

例如:

with ok(ok1,ok2) as (select CName,Credit from Course)

select * from ok

 
这里只说了公用表表达式的非递归使用,实际上它还可以递归使用,以后再学。