数据库-视图
Posted EbowTang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库-视图相关的知识,希望对你有一定的参考价值。
⼀、视图简介
视图是从⼀个或⼏个基本表(或视图)中导出的虚拟的表。在系统的数据字典中仅存放了视图的定义,不存放视图对应的数据。视图是 原始数据库数据的⼀种变换,是查看表中数据的另外⼀种⽅式。可以将视图看成是⼀个移动的窗⼝,通过它可以看到感兴趣的数据。视图是 从⼀个或多个实际表中获得的,这些表的数据存放在数据库中。那些⽤于产⽣视图的表叫做该视图的基表。⼀个视图也可以从另⼀个视图中 产⽣。
视图的定义存在数据库中,与此定义相关的数据并没有再存⼀份于数据库中。通过视图看到的数据存放在基表中。 视图看上去⾮常像数据库的物理表,对它的操作同任何其它的表⼀样。当通过视图修改数据时,实际上是在改变基表中的数据;相反 地,基表数据的改变也会⾃动反映在由基表产⽣的视图中。由于逻辑上的原因,有些视图可以修改对应的基表,⽽有些则不能(仅仅能查 询)。
⼆、视图的作⽤
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条件
以上是关于数据库-视图的主要内容,如果未能解决你的问题,请参考以下文章