数据库-视图

⼀、视图简介

视图是从⼀个或⼏个基本表(或视图)中导出的虚拟的表。在系统的数据字典中仅存放了视图的定义,不存放视图对应的数据。视图是 原始数据库数据的⼀种变换,是查看表中数据的另外⼀种⽅式。可以将视图看成是⼀个移动的窗⼝,通过它可以看到感兴趣的数据。视图是 从⼀个或多个实际表中获得的,这些表的数据存放在数据库中。那些⽤于产⽣视图的表叫做该视图的基表。⼀个视图也可以从另⼀个视图中 产⽣。

视图的定义存在数据库中,与此定义相关的数据并没有再存⼀份于数据库中。通过视图看到的数据存放在基表中。 视图看上去⾮常像数据库的物理表,对它的操作同任何其它的表⼀样。当通过视图修改数据时,实际上是在改变基表中的数据;相反 地,基表数据的改变也会⾃动反映在由基表产⽣的视图中。由于逻辑上的原因,有些视图可以修改对应的基表,⽽有些则不能(仅仅能查 询)。

⼆、视图的作⽤

1. 简化了操作,

把经常使⽤的数据定义为视图 我们在使⽤查询时,在很多时候我们要使⽤聚合函数,同时还要显⽰其它字段的信息,可能还会需要关联到其它表,这时写的语句可能 会很长,如果这个动作频繁发⽣的话,我们可以创建视图,这以后,我们只需要select * from view就可以啦,这样很⽅便。

2. 安全性,

⽤户只能查询和修改能看到的数据。 因为视图是虚拟的,物理上是不存在的,只是存储了数据的集合,我们可以将基表中重要的字段信息,可以不通过视图给⽤户,视图是 动态的数据的集合,数据是随着基表的更新⽽更新。同时,⽤户对视图不可以随意的更改和删除,可以保证数据的安全性。

3. 逻辑上的独⽴性,

屏蔽了真实表的结构带来的影响。 视图可以使应⽤程序和数据库表在⼀定程度上独⽴。如果没有视图,应⽤⼀定是建⽴在表上的。有了视图之后,程序可以建⽴在视图之 上,从⽽程序与数据库表被视图分割开来。

三、缺点

1. 性能差

数据库必须把视图查询转化成对基本表的查询,如果这个视图是由⼀个复杂的多表查询所定义,那么,即使是视图的⼀个简单查询,数 据库也要把它变成⼀个复杂的结合体,需要花费⼀定的时间。

2. 修改限制

当⽤户试图修改视图的某些信息时,数据库必须把它转化为对基本表的某些信息的修改,对于简单的视图来说,这是很⽅便的,但是, 对于⽐较复杂的试图,可能是不可修改的。

四、视图的小结:

参考oracle和KES总结

在KES数据库上的视图SQL测试代码:

--------------------------------------------------
--视图的测试与验证
--------------------------------------------------
--创建实验表
CREATE TABLE student (
	stu_nmb number(8),
	stu_name char(8) not null,
	gender varchar2(2),
	age number(2),   --检查约束
	class varchar2 (40) not null,
	email varchar2 (30),
	sdate DATE,
	constraint  con_nmb primary key (stu_nmb),
	constraint con_check check ( gender in ('男','女')),
	constraint ch_age	CHECK (age BETWEEN 18 AND 30),   --检查约束
	constraint uk_student_email UNIQUE (email)
);

--首先插入,正确
INSERT INTO student VALUES(2314,'张德田','男',19,'高三第6班','28@qq.com',SYSDATE);
INSERT INTO student VALUES(4324,'吴海峰','男',18,'高三第1班','21@qq.com',SYSDATE);
INSERT INTO student VALUES(2614,'章德正','男',20,'高三第8班','24@qq.com',SYSDATE);
INSERT INTO student VALUES(2184,'宋义','女',20,'高三第3班','98@qq.com',SYSDATE);
INSERT INTO student VALUES(9874,'张华乐','女',19,'高三第4班','12@qq.com',SYSDATE);
INSERT INTO student VALUES(1474,'黎文','女',19,'高三第4班','13@qq.com',SYSDATE);
INSERT INTO student VALUES(6574,'吉祥','男',21,'高三第7班','22@qq.com',SYSDATE);
INSERT INTO student VALUES(8174,'向玲','女',19,'高三第1班','23@qq.com',SYSDATE);
INSERT INTO student VALUES(1414,'梅田田','女',21,'高三第7班','25@qq.com',SYSDATE);

--公共语句
drop table if exists student; --oracle没有这个语法,mysql和KES存在
select * from student;
--删除视图
drop  view age_view;
drop  view age_view1;
drop  view avg_answer_view;
drop  view test1;


--select简单语句
select stu_nmb,stu_name 
from student
where age > 20 and gender = '男';

--创建上述语句的一个的简单视图
create force view age_view as 
select stu_nmb,stu_name 
from student
where age > 20 and gender = '男'
with local check option ;--可选,限定DML语句操作必须满足一定条件


create force  view age_view1 as 
select stu_nmb,stu_name 
from student
where age > 19 and gender = '女'
with local check option ;--可选,限定DML语句操作必须满足一定条件

--查看视图,和select返回的一样的效果,视图使用方法和表
select * from age_view;
select * from age_view1;

--通过视图执行DML语句,限制很多,其中最重要的是插入的数据必须能被视图查询获取到,否则无法插入
--比如下列语句能插入成功,因为是男性且大于20岁
INSERT INTO age_view VALUES(7261,'王萌','男',21,'高三第2班','51@qq.com',SYSDATE);

--创建无效视图,没有FORCE参数,将报错,有该参数的情况下,只要没有语法错误将
create force view novalid_view as 
select * 
from no_has_testtable --该表不存在,如果后续该表被创建出来,则

drop view novalid_view;
select  * from novalid_view;


--测试视图子句
--------------------------------
---公共测试语句
drop view v2; --删除视图
drop view v1; --删除视图
drop view v3; --删除视图
drop table t1;
truncate  t1; --清空表

--创建表
CREATE TABLE t1 (
	c INT
);

--v1视图,必须大于10(没有WITH CHECK OPTION约束限制)
CREATE OR REPLACE VIEW v1 AS
select c
from t1
where c > 10;

--v2视图,必须大于20
--基于v1创建或替换v2视图,且有WITH local CHECK OPTION;约束
CREATE OR REPLACE VIEW v2 AS
select c
from v1   --基于视图v1
where c < 20  --比如插入12,将无法插入
WITH local CHECK OPTION;

--基于v1创建或替换v3视图,且有WITH CHECK OPTION;约束(CASCADED)
--v3视图,必须小于20
CREATE OR REPLACE VIEW v3 AS
select c
from v1
where c < 20  --比如插入1,将无法插入
WITH CHECK OPTION;

--因为没有指定WITH CHECK OPTION,所以以下语句即使不符合v1视图的定义也执行插入(但是由于不满定义的视图,所以无法插入成功):
INSERT INTO v1(c) VALUES (5); --不满足当前视图,KES会执行但是不会报错,但是无法插入成功
--执行成功
INSERT INTO v1(c) VALUES (12);--满足当前视图,可以成功
--测试v2的LOCAL限制
INSERT INTO v2(c) VALUES (5);  --满足当前视图,可以成功
INSERT INTO v2(c) VALUES (12); --满足当前视图,可以成功
INSERT INTO v2(c) VALUES (20); --不满足当前视图,无法成功
--测试v3的CASCADED限制
INSERT INTO v3(c) VALUES (50);  ---不成功,不满足当前表的where条件
INSERT INTO v3(c) VALUES (1);  --不成功,违反了v1的where条件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值