引言
视图可以理解为查询后得出的结果表。此时有一个疑惑:
那直接把查询后得出的结果存为表不就行了?和视图有什么区别
答案是:前者当基本表作出修改后不会同步更新,而后者可以
1.视图的创建
1.1 语法
CREATE VIEW 视图名
[WITH ENCRYPTION] --可选,表示视图是否加密--
AS
SELECT 查询语句
[WITH CHECK OPTION] --可选,表示是否限制视图修改--
1.2 别名
在视图名后面列出字段名可以给视图中的字段起别名,如下
CREATE VIEW V_Sal(平均工资,最高工资,最低工资)
AS
SELECT AVG(salary),MAX(salary),MIN(salary)
FROM customer
括号内无需单引号
1.3 创建视图时的注意事项
如第二点所述,故要想排序,只能在查询时用 ORDER BY
语句,而非创建时
1.4 创建加密视图
若使用 WITH ENCRYPTION
,则视图被加密。主要作用在于定义视图的语句会被隐藏,而非视图本身
1.5 细说 WITH CHECK OPTION
- 对于
update
和Insert
,若有with check option
,则须保证修改或插入的数据在视图创建时的WHERE
语句的条件范围内
[[简单来说就是加的东西要能被查到]]
若创建视图时候没有用with check option
,update
和Insert
的数据即便在条件之外也仍然可以运行,但是在视图中看不到,而基本表中却可以显现
例:创建价格小于2000的产品视图VIEW_CP_PRICE2000,要求加密并保证对该视图的更新都要符合价格小于2000这个条件
CREATE VIEW VIEW_CP_PRICE2000
WITH ENCRYPTION
AS
SELECT *
FROM product
WHERE price<2000
with check option
GO
UPDATE VIEW_CP_PRICE2000
SET price=4200
WHERE Pname='海尔洗衣机'
GO
运行结果:
消息 550,级别 16,状态 1,第 1 行
试图进行的插入或更新已失败,原因是目标视图或者目标视图所跨越的某一视图指定了 WITH CHECK OPTION,而该操作的一个或多个结果行又不符合 CHECK OPTION 约束。
语句已终止。
更改上例中的 UPDATE
语句如下
UPDATE VIEW_CP_PRICE2000
SET price=1999 --使得在WHERE范围内--
WHERE Pname='海尔洗衣机'
则运行成功
- 对于
delete
,有无with check option
都一样; - 对于没有
where
子句的视图,使用with check option是多余的。
2. 视图的查询
没啥别的可以说,就和查询表一样的语句
3. 视图的更新
这里的更新指的是修改其中内容,而非结构
仍然可以使用
UPDATE
更新数据
更新数据时有一些注意点如下
[[实验:不可更新视图测试]]
创建一个视图 V_Sal(AvgSal,MaxSal,Minsal):
查询所有客户的平均月薪,最高月薪和最低月薪.
CREATE VIEW V_Sal(AvgSal,MaxSal,Minsal)
AS
SELECT AVG(salary),MAX(salary),MIN(salary)
FROM customer
GO
SELECT *
FROM V_Sal
结果如图
试着向视图V_Sal中添加一行数据:
Insert into V_Sal(AvgSal,MaxSal,Minsal)
Values(5600,12680,2210)
GO
SELECT *
FROM V_Sal
预期一样会报错
INSERT
插入数据DELETE
删除数据
4. 视图的删除
DROP VIEW 视图名称
删的挺干净,资源管理器里都查不到了,没啥好说