1. 视图概念
视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
视图存储查询语句,当调用的时候,产生结果集,视图充当的是虚拟表的角色.
2. 视图的优点
视图能够对机密数据提供安全保护
有了视图机制,就可以在设计数据库应用系统时,对不同的用户定义不同的视图,使机密数据不出现在不应该看到这些数据的用户视图上。这样视图机制就自动提供了对机密数据的安全保护功能。例如,Student表涉及全校15个院系学生数据,可以在其上定义15个视图,每个视图只包含一个院系的学生数据,并只允许每个院系的主任查询和修改本原系学生视图。有灵活性的功能需求后,需要改动表的结构而导致工作量比较大。那么可以使用虚拟表的形式达到少修改的效果。这是在实际开发中比较有用的
例子:假如因为某种需要,a表与b表需要进行合并起来组成一个新的表c。最后a表与b表都不会存在了。而由于原来程序中编写sql分别是基于a表与b表查询的,这就意味着需要重新编写大量的sql(改成向c表去操作数据)。而通过视图就可以做到不修改。定义两个视图名字还是原来的表名a和b。a、b视图完成从c表中取出内容。
说明:使用这样的解决方式,基于对视图的细节了解越详细越好。因为使用视图还是与使用表的语法上没区别。比如视图名a,那么查询还是"select * from a"。复杂的查询需求。可以进行问题分解,然后将创建多个视图获取数据。将视图联合起来就能得到需要的结果了。
视图能简化用户操作
视图机制使用户可以将注意力集中在所关心地数据上。如果这些数据不是直接来自基本表,则可以通过定义视图,使数据库看起来结构简单、清晰,并且可以简化用户的的数据查询操作。例如,那些定义了若干张表连接的视图,就将表与表之间的连接操作对用户隐藏起来了。换句话说,用户所作的只是对一个虚表的简单查询,而这个虚表是怎样得来的,用户无需了解。视图使用户能以多种角度看待同一数据
视图机制能使不同的用户以不同的方式看待同一数据,当许多不同种类的用户共享同一个数据库时,这种灵活性是非常必要的。视图对重构数据库提供了一定程度的逻辑独立性
数据的物理独立性是指用户的应用程序不依赖于数据库的物理结构。数据的逻辑独立性是指当数据库重构造时,如增加新的关系或对原有的关系增加新的字段,用户的应用程序不会受影响。层次数据库和网状数据库一般能较好地支持数据的物理独立性,而对于逻辑独立性则不能完全的支持。
3. 视图的工作机制
视图的工作机制:当调用视图的时候,才会执行视图中的sql,进行取数据操作。视图的内容没有存储,而是在视图被引用的时候才派生出数据。这样不会占用空间,由于是即时引用,视图的内容总是与真实表的内容是一致的。视图这样设计有什么好处?节省空间,内容是总是一致的话,那么我们不需要维护视图的内容,维护好真实表的内容,就可以保证视图的完整性了。
4. 视图的创建
4.1 创建视图
CREATE VIEW 视图名(列1,列2...) |
可以看到,创建视图和查询相比,增加了前面的CREATE VIEW 视图名 AS
4.2 视图的运用
使用视图和使用表完全一样,只需要把视图当成一张表就OK了。视图是一张虚拟表。
4.3 查看视图
(1) 查看数据库中有哪些视图 show tables
前面提到,视图就是虚拟的表,因此,查看视图的方法和查看表的方法是一样的:
SHOW TABLES; |
通过show tables;反馈得到所有的表和视图。同样的,我们可以通过模糊检索的方式专门查看视图,这个时候,视图的命令统一采用v_视图名的优势就体现出来了。
(2) 查看视图详情
查看视图详情的方法有两种,一种是和查看表详情一样使用desc 视图名,另外一种方法是show fields from 视图名:
DESC 视图名; |
两种方法得到的详情都是一模一样的。
5. 视图的数据变更
5.1 表格数据变更
将表中的数据进行更新,在通过视图检索后的结果也会变更,因此,在此证明了:
视图不是表,不保存数据,知识一张虚拟表;
5.2 通过视图变更数据
- 插入数据
通过试图插入数据后表格中的数据也会插入可以通过视图插入数据,但是只能基于一个基础表进行插入,不能跨表更新数据。
- WITH CHECK OPTION
如果在创建视图的时候制定了“WITH CHECK OPTION”,那么更新数据时不能插入或更新不符合视图限制条件的记录。
eg:对表user创建一个id大于4视图,并加上“WITH CHECK OPTION”,之后插入一个id为3的记录:
//创建视图 |
通过视图修改,可能导致数据无故消失,因此:
没有特殊的理由,建议加上“WITH CHECK OPTION”命令。
注意点:
- 视图不是表,不直接存储数据,是一张虚拟的表;
- 一般情况下,在创建有条件限制的视图时,加上“WITH CHECK OPTION”命令。