第 11 章 视图
来源:互联网 发布:淘宝店铺怎么修改模板 编辑:程序博客网 时间:2024/05/21 19:37
视图在数据库中的作用类似窗户一样。视图也被称为虚拟的表,程序员可以通过视图查看数据库表中的数据,但又不用考虑数据库表的结构关系,并且就算是对数据表做了修改,也不用修改前台程序代码,而只需要修改视图即可。视图即保障了数据的安全性又大大提高了查询效率,所以在数据库程序开发设计中视图被广泛使用。
11.1 视图的定义
视图是一个由查询语句定义数据内容的表,表中的数据内容就是SQL查询语句的结果集,行和列的数据均来自SQL查询语句中使用的数据表。但之所以说视图是虚拟的表,是因为视图并不在数据库中真实存在,而是在引用视图时动态生成的。使用视图和查询数据表优势:
- 使用视图简单,操作视图和操作数据表完全是两个概念,用户不用清理数据表之间复杂的逻辑关系,而且将经常使用的SQL数据查询语句定义为视图,可以有效地避免代码重复减少工作量。
- 使用视图安全,用户只访问到视图给定的内容集合,这些都是数据表的某些行和列,避免用户直接操作数据表引发的一系列错误。
- 使用视图相对独立,应用程序访问是通过视图访问数据库,从而程序和数据表之间被视图分离。如果数据表有变化,完全不用去修改SQL语句,只需要调整视图的定义内容,不用调整应用程序代码。
- 复杂的查询需求。可以进行问题分解,然后将创建多个视图获取数据,再将视图联合起来就能得到需要的结果了。
视图的工作机制:
当调用视图的时候,才会执行图中的SQL,进行取数据操作。视图的内容没有存储,而是在视图被引用的时候才派生出数据。这样不会占用空间,由于是即时引用,视图的内容与真时表的内容总是一致的。
提示:视图总是显示最近的数据。每当用户查询视图时,数据库都将重建数据。
11.2 视图的创建、修改和删除
11.2.1 创建视图
创建视图的语法格式如下:
CREATE [ALGORITHM={UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name AS
SELECT column_name(s) FROM table_name
[WITH[CASCADED | LOCAL] CHECK OPTION];
其中,ALGORITHM为可选参数,表示视图选择的算法。UNDEFINED表示MySQL将自动选择所要使用的算法;MERGE表示将视图的语句与视图的定义合并起来,使得视图定义的某一部分去带语句的对应部分;TEMPTABLE表示将视图的结果存入临时表,然后使用临时表执行语句。
view_name为指创建视图的名称,可包含其属性列表。
column_name(s)为指查询的字段,也就是视图的列名。
talbe_name指从那个数据表获取数据,这里也可以从多个表获取数据,格式写法请读者自行参考SQL联合查询。
WITH CHECK OPTION为可选参数,表示更新视图时要保证在视图的权限范围内。CASCADED表示更新视图时要满足所有相关视图和表的条件才进行更新,默认是CASCADED;LOCAL表示更新视图时,要满足该视图本身定义的条件即可更新。
该语句能够创建新的视图,如果给定了OR REPLACE子句,该语句还能替换已有的视图。select_statement是一种SELECT语句,它给出了视图的定义。该语句可从基表或其他视图进行选择。
该语句要求具有针对视图的CREATE VIEW权限,以及针对由SELECT语句选择的每一列上的某些权限。对于SELECT语句中的其他地方使用的列,必须具有SELECT权限。如果还有OR REPLACE子句,必须在视图上具有DROP权限。
**提示:**WITH CHECK OPTION虽是可选属性,但为了数据安全性建议读者使用。
视图定义服从以下限制:
- SELECT语句不能包含FROM子句中的子查询;
- SELECT语句不能引用系统或用户变量;
- SELECT语句不能引用预处理语句参数;
- 在存储子程序内,定义不能引用子程序参数或局部变量;
- 在定义中引用的表或视图必须存在。但是,创建了视图后,能够舍弃定义引用的表或视图。要想检查视图定义是否存在这类问题,可使用CHECK TABLE语句。
- 在定义中不能引用TEMPORARY表,不能创建TEMPORARY视图;
- 在视图定义中命名的表必须存在;
- 不能将触发程序与视图关联在一起;
- 在视图定义中允许使用ORDER BY,但是,如果从特定视图进行了选择,而该视图使用了具有自己ORDER BY的语句,它将被忽略。
- 对于定义中的其他选项或子句,他们将被 增加到引用视图的语句的选项或子句中,但效果未定义。
- 如果创键了视图,并通过更改系统变量更改了查询处理环境,会影响从视图获得的的结果。
11.2.2 修改视图
视图的修改是指修改了数据表的定义,当视图定义的数据表字段发生了变化时,需要对视图进行修改来保证查询的正确进行。MySQL使用CREATE OR REPLACE VIEW语句修改视图。在MySQL中,使用CREATE OR REPLACE VIEW语句可以修改视图。视图存在时,可以对视图进行修改;视图不存在时,可以创建视图。语法格式如下:
CREATE OR REPLACE [ALGORITHM={UNDEFINED | MERGE | TEMPTABLE}
VIEW 视图名[(属性清单)]
AS SELECT 语句
[WITH [CASCADED | LOCAL] CHECK OPTION];
- ALGORITHM:可选。表示视图选择的算法;
- UNDEFINED:表示MySQL将自动选择所要使用的算法;
- MERGE:表示将使用视图的语句与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分。
- TEMPTABLE:表示将视图的结果存入临时表,然后使用临时表执行语句。
- 视图名:表示要创建的视图的名称。
- 属性清单:可选。指定了视图中各个属性的名词,默认情况下,与SELECT语句中查询的属性相同。
- SELECT语句:是一个完整的查询语句,表示从某个表中查出某些满足条件的记录,将这些记录导入视图中。
- WITH CHECK OPTION:可选。表示修改视图时要保证在该视图的权限范围内。
- CASCADED:可选。表示修改视图时,需要满足跟该视图有关的所有相关视图和表的条件,该参数为默认值。
- LOCAL:表示修改视图时,只要满足该视图本身定义的条件即可。
除了使用CREATE OR REPLACE修改视图外,还可以使用ALTER来进行视图修改,用法类似。这两种方法主要是对视图的结构进行修改,其实MySQL也可以对视图内容进行根性**也就是视图的UPDATE操作,是可以通过视图进行增加、删除、修改数据表中的数据,当然对视图的更新操作实质都是对数据表进行操作。**ALTER语句只能修改已经存在的视图,而CREATE OR REPLACE不仅可以修改已经存在的视图,也可以创建视图。因此通常情况下,最好选择CREATE OR REPLACE。
11.2.3 删除视图
因为视图本身只是一个虚拟表,没有物理文件存在,所以视图的删除并不会删除数据,只是删除掉视图的结构定义。语法如下:
DROP VIEW [IF EXISTS] view_name [, view_name1, view_name2…]
11.3 视图的使用
视图被使用最多的地方就是查询,与普通数据表的SELECT查询没有多大区别。
因为视图使是一种虚拟的数据表,它们的行为和数据表一样,但并不真正包含数据。它们是用底层(真正的)数据表或其他视图定义出来的“假”数据表,用来提供查看数据表数据的另一种方,这通常可以简化应用程序。所以也可以使用SHOW TABLES 的命令查到该视图,并查看视图基本信息。
如果要选取某给定数据表的数据列的一个子集,把它定义为一个简单的视图是最方便的做法。
另外,查看视图的相关信息,还可以使用SHOW CREATE VIEW,如果想要简单查看视图定义的结构,可以使用DESCRIBE命令。
- 第11章 视图
- 第 11 章 视图
- 第11章 通用视图
- 第8章 视图(加密视图、索引视图、分区视图)
- 第13章 视图
- 第3章 视图
- 第6章 状态机视图
- 第10章 模型管理视图
- iPhone秘籍 第2章 视图
- 第6章多视图应用程序通解
- iOS 第13章-导航视图
- iOS第13章 表格视图
- 《自己动手设计数据库》第12章 视图
- 第 3 章 视图(续)
- 第6章-渲染WEB视图
- 第2章 控制器 第3章 视图(强类型视图,视图模型、Razor 视图引擎、布局、Html.Partial与Html.Action)
- 《MySQL入门很简单》学习笔记(8)之第8章视图(关键词:数据库/MySQL/创建视图/修改视图/查看视图/删除视图)
- 【多视图几何】TUM 课程 第5章 双视图重建:线性方法
- JavaScript设计模式之策略模式
- Java JNI 实例 Demo
- Scikit-learn安装
- QT:富文本转换成pdf
- Hololens的前景
- 第 11 章 视图
- iOS-嵌入SM3算法
- 更换navicat之后,数据库的连接信息会自动保存,不会丢失
- Eclipse Maven开发环境搭建
- 【Python】 调用百度地图API抓取西安市小区信息
- 分布式大数据多维分析(OLAP)引擎Apache Kylin安装配置及使用示例
- tomcat7插件结合jrebel进行热部署的一些探索
- 每日分享之《生命树》
- 面试题:移动端1px边框的样式