目录
一、概述
视图 (VIEW) 与表的行为相似,但它是“虚表”。可使用DQL查询或DML操作记录,视图可以让用户的操作更方便,且极大保障数据库安全。视图是虚拟表,是从多个表中导出来的,它还可以从已经存在的视图的基础上定义。
视图一经定义便存储在数据库中,通过视图看到的本质还是原表中的数据。对视图的操作(查询、修改和删除)会影响相应的基本表。同样地,原表更改,视图也会有变化。
二、创建视图(DDL)
视图包含SELECT查询出的结果,因此视图的创建基于SELECT语句和已存在的数据表,它可以建立在一张或多张 table 上。
公式:
CREATE [OR REPLACE] [[NO] FORCE] VIEW
[Schema.] view_name
[(Alias, ...)inline_constraint(s)]
[out_of_line_constraint(s)]
AS SubQuery
[
WITH {Read Only Check Opinion[Constraint constraint_name]}
];
[ [NO] Force ]:表示是否强制创建视图。
[ Schema. ]:视图所属模式的名称,schema是数据对象的集合,包括像表、视图、索引、同义词等等都可以说是schema的对象。
[(Alias, ...)inline_constraint(s)]:表示视图字段的别名和内联的名称。
[out_of_line_constraint(s)]:表约束,与上面的inline相反。
Constraint:约束。
SubQuery:子查询。
With Read Only:只读。
With Check Opinion:一旦使用该限制,当对视图修改/增加 数据时,必须满足子查询的条件。
假设有两张表:tb_student 和 tb_stuinfo
CREATE TABLE tb_student
(
s_id number(12), --学号
name varchar2(40) --姓名
);
CREATE TABLE tb_stuinfo
(
s_id number(12), --学号
class varchar2(40), --班级
addr vaarchar2(100) --住址
);
创建一个视图多表查询它的学号,姓名,班级
CREATE VIEW V_CLASS (id, name, class)
AS
SELECT STU.s_id, STU.name, INFO.class
FROM tb_student STU, tb_stuinfo INFO
WHERE STU.s_id=INFO.s_id;
创建视图的视图
不过是在子查询语句中将 From tb_name 换成 From view_name。
三、修改&删除
可用CREATE OR REPLACE 或 ALTER 语句
添加唯一约束
ALTER VIEW V_class
ADD CONSTRAINT T_UNQ UNIQUE (ID)
DISABLE NOVALIDATE;
上面实例为字段ID 添加了唯一约束,约束名为T_UNQ
DISABLE NOVALIDATE表示此前 和 此后数据都不检查
删除视图用DROP
DROP VIEW view_name;
更新视图中的数据
创建视图,供应商号为105,且水果价格大于5元,并且给 'Melon' 涨价10元
--创建视图,供应商号为105,且水果价格大于5元
CREATE OR REPLACE VIEW view_iop
AS SELECT s.s_id,f.f_name, f.f_price
FROM suppliers s, fruits f
WHERE s.s_id=f.s_id AND s.s_id=105 AND f.f_price>5;
SELECT * FROM view_iop;
--给‘Melon’涨价10元
UPDATE view_iop
SET f_price=f_price+10
WHERE f_name='melon';
若操作成功,原表中的数据也将被更改。
四、限制视图的数据操作
设为只读属性,防止用户修改数据
CREATE OR REPLACE VIEW view_tt
AS SELECT col1, col2
FROM tb_name
WITH READ ONLY;
创建完成后,若向视图插入、更新、删除数据时,会报错。
设置视图的检查属性
创建一个视图,限制条件为字段 price 的值大于10
CREATE OR REPLACE VIEW view_prc
AS SELECT col1, col2
FROM tb_name
WHERE price>10
WITH CHECK OPINION;
创建完成后,向视图 view_prc 插入、更新、删除数据时,会受到检查条件的限制。
五、相关问题
什么时候视图无法进行更新操作?
- 视图中不包含基本表中被定义为非空的列【全为空】
- 在定义视图时SELECT语句后的字段列表中使用数学表达式
- 在定义视图时SELECT语句后的字段列表中使用聚合函数【AVG, COUNT, SUM...】
- 在定义视图时SELECT语句中使用DISTINCT, UNION, TOP, GROUP BY, HAVING语句