数据库-视图

Posted EbowTang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库-视图相关的知识,希望对你有一定的参考价值。

一、视图简介
视图是从一个或几个基本表(也可以是视图)导出的表。
它与基本表不同,是一个虚表。数据库只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。
所以基本表中的数据发生变化,从视图中查询出的数据也就随之改变了。
从这个意义上讲,视图就像一个窗口,透过它可以看到数据库中自己感兴趣的数据及其变化。
视图只供查询。


二、视图的作用:
1、视图隐藏了底层的表结构,简化了数据访问操作,客户端不再需要知道底层表的结构及其之间的关系。
2、视图提供了一个统一访问数据的接口。(即可以允许用户通过视图访问数据的安全机制,而不授予用户直接访问底层表的权限)
3、从而加强了安全性,使用户只能看到视图所显示的数据。
4、视图还可以被嵌套,一个视图中可以嵌套另一个视图。

三、视图的小结:

参考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条件

CSDN 社区图书馆,开张营业! 深读计划,写书评领图书福利~

以上是关于数据库-视图的主要内容,如果未能解决你的问题,请参考以下文章

数据库三范式

这世间普遍的悖论

JAVA多线程提高三:线程范围内共享变量&ThreadLocal

高三英语词汇哪里可下载?

提前查分?内部大数据?鹤山高三考生,千万别被套路了!

XJOI 高三楼