当前位置:网站首页>第4章_2——视图的使用
第4章_2——视图的使用
2022-07-29 13:53:00 【云墨书生】
创建与使用视图
一、视图的概念及优点
1.1、概念
视图是一种常用的数据库对象,可以把它看做一个或几个源表导出的虚表或存储在数据库中的查询,对于视图所引用的源表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其他数据库的一个或多个表,或者其他视图。视图与数据表不同,数据库中只存放了视图的定义,即SQL语句,而不存放视图对应的数据,数据存放在源表中,当源表中的数据发送变化时,从视图中查询出的数据也会随之改变。对视图进行操作时,系统根据视图的定义去操作与视图相关联的数据表。
视图一经定义后,就可以像源表一样被查询和删除。视图为查看和存取数据提供了另外一种途径,对于查询完成的大多数操作,使用视图一样也可以完成;使用视图还可以简化数据操作;当通过视图修改数据时,相应的源表的数据也会发生变化;同时,若源表的数据发生变化,则这种变化也可以自动地同步反映到视图中。
1.2、优点(了解)
(1)简化操作
视图大大简化了用户对数据的操作,如果一个查询非常复杂,跨越多个数据表,那么通过将这个复杂查询定义为视图,这样在每一次执行相同的查询时,只要一条简单的查询视图语句即可。可见视图向用户隐藏了表与表之间复杂的连接操作。
(2)提供数据安全性
视图创建了一种可以控制的环境,为不同的用户定义不同的视图,使每个用户只能看到其有权看到的部分数据。那么没有必要的、敏感的或不适合的数据都从视图中排除了,用户只能查询和修改视图中显示的数据。
(3)屏蔽数据库的复杂性
用户不必了解数据库中复杂的表结构,视图将数据库设计的复杂性和用户的使用方式屏蔽了。数据库管理员可以在视图中将那些难以理解的列替换成数据库用户容易理解和接受的名称,从而为用户使用提供了极大便利,并且数据库中表的更改也不会影响用户对数据库的使用。
(4)数据即时更新
当视图所基于的数据表发生变化时,视图能够即时更新,提供了与数据表一致的数据。
(5)便于数据共享
各用户不必都定义和存储自己所需的数据,可共享数据库的数据。即同样的数据只需存储一次。
二、创建与使用视图
视图在数据库中是作为一个对象来存储的。用户创建视图前,要保证自己已被数据库所有者授权可以使用Create View语句,并且有权操作视图所涉及的数据表或其他视图。
2.1、创建视图的语法格式
创建视图可以使用Create View语句,该语句完整的语法格式如下:
Create
[Or Replace]
[<算法选项>]
[<视图定义者>]
[<安全性选项>]
View <视图名> [<字段名称列表>]
As <Select语句>
[检查选项]
各个选项说明如下:(了解)
① 创建视图语句的关键字包括Create、View、As。
② 可选项“Or Replace”表示如果存在已有的同名视图,则覆盖同名视图。
③ 可选项“算法选项”的语法格式为Algorithm = { Undefined | Merge | Temptable }。该选项指定视图的处理方式。算法选项Algorithm有3个可选值——Undefined、Merge、Temptable。其中,Undefined表示自动选择算法,一般会首选Merge,因为Merge更有效率,而且Temptable也不支持更新操作;Merge表示将视图的定义和查询视图的语句合并处理,使得视图定义的某一部分取代语句的对应部分,Merge算法要求视图中的行和源表中的行具有一对一的关系,如果不具有该关系,必须使用临时表取而代之;Temptable表示将视图查询的结果保存到临时表中,而后在该临时表的基础上执行查询视图的语句。如果没有Algorithm子句,则默认算法为Undefined。
④ 可选项“视图定义者”的语法格式为Definer = { User | Current_User },如果没有Definer 子句,视图的默认定义者为Current_User ,即为当前用户。当然,创建视图时也可以指定不同的用户作为创建者(或者称视图所有人)。
⑤ 可选项“安全性选项”的语法格式为 Sql Security { Definder | Invoker }。该选项指定视图查询数据时的安全验证方式。其中,Definder表示在创建视图时验证是否有权限访问视图所引用的数据,只要创建视图的用户有权限,那么创建就可以成功,而且所有有权限查询该视图的用户也能够成功执行查询语句,而不管是否拥有该视图所引用的对象,当然,创建时也会判断,如果创建的用户没有视图所引用表对象的访问权限,则创建会失败。
⑥ 视图名必须唯一,不能出现重名的视图。视图的命名必须遵循MySQL中标识符的命名规则,不能与数据库同名,且每个用户视图名必须是唯一的,即对不同用户,即使是定义相同的视图,也必须使用不同的名称。默认情况下,应在当前数据库中创建视图,如果想要给定数据库中明确创建视图,则创建时,应将视图名称指定为<数据库名>.<视图名>。
⑦ 可选项“字段名称列表”可以为视图的字段定义明确的名称,多个名称间由半角逗号“,”分隔,这里所列的字段名数目必须与后面的Select语句中检索的字段数相等。如果使用与源表或视图中相同的字段名,则可以省略该选项。
⑧ 用于创建视图的Select语句为必选项,可以在Select语句中查询多个数据表或视图。
⑨ 可选项“检查选项”的语法格式为[With [Cascaded | Local ] Check Option。该选项指出在可更新视图上所进行的修改都要符合Select语句所指定的限制条件,这样可以确保数据修改后,仍可通过视图查看修改的数据。当视图是根据另一个视图定义时,参数Cascaded表示更新视图时想要满足所有相关视图和数据表的条件,参数Local表示更新视图时满足该视图本身定义的条件即可。如果没有指定任一关键字,则默认值为Cascaded。
创建视图是很简单的,这就跟创建表是相似的。创建视图是有两种方法的:一种是使用上面的语句来创建;另一种则是使用试图创建工具来创建试图,这种方法是取巧的方法(建议是在将使用代码来创建的方法先熟练了,再去使用它)。
-- 通过“图书信息2”表创建视图
CREATE OR REPLACE
VIEW view_图书信息
AS
SELECT ISBN编号,图书名称,出版社ID,图书类型
FROM `图书信息2`
WHERE 价格 >= 30;
-- 查看修改后的视图
SELECT *
FROM view_图书信息;
2.2、创建视图的注意事项
创建视图的注意事项如下:
- 定义视图的用户必须对所参照的源表或视图又查询(即可执行Select语句)的权限,运行创建视图的语句需要用户具有创建视图(Create View)的权限,当加了“Or Replace”选项时,还需要用户具有删除视图(Drop View)的权限;
- Select语句不能包含From子句中的子查询;
- Select语句不能引用系统或用户变量;
- Select语句不能引用预处理语句参数;
- 在存储子程序内,定义不能引用子程序参数或局部变量;
- 在定义中引用的表或视图必须存在。但是,创建了MySQL视图后,能够舍弃定义引用的表或视图。要想检查视图定义是否存在这类问题,可使用Check Table语句;
- 在定义中不能引用Temporary表,不能创建Temporary视图;
- 在视图定义中命名的表必须已存在,当引用不是当前数据库的表或视图时,要在数据表或视图前加上数据库的名称;
- 不能将默认值或触发器与视图关联在一起;
- 在视图定义中允许使用Order By,但是,如果从特定视图进行了选择,而该视图使用了具有自己的Order By的语句,则它将被忽略;
- 不能在视图上创建任何索引,包括全文索引。
2.3、修改视图
当视图不符合使用需求时,可以使用Alter View语句对其进行修改,视图的修改与创建相似,其语法格式如下:
Alter
[<算法选项>]
[<视图定义者>]
[<安全性选项>]
View <视图名> [<视图的字段名称列表>]
As <Select语句>
[检查选项]
Alter View语句的语法与Create View语句是类似,所以可以将两者放在一起进行记忆和理解。
-- 对视图view_图书信息进行修改,将价格修改为大于等于20的
ALTER
ALGORITHM = UNDEFINED
DEFINER = root@localhost
SQL SECURITY DEFINER
VIEW `view_图书信息` AS
SELECT
ISBN编号,图书名称,作者,价格,出版社ID,出版日期
FROM `图书信息2`
WHERE 价格 >= 20;
-- 查看修改后的视图
SELECT *
FROM `view_图书信息`;
2.4、使用视图查询与更新数据表中的数据
更新视图是指通过视图来插入、更新和删除数据表中的数据。因为视图是一个虚拟表,所以其中是没有数据的。通过视图更新时,都是转换到源表中来更新的。更新视图时,只能更新权限范围内的可以更新的数据,超出权限范围时无法更新。
(1)查询视图数据
对视图进行查询,这个是非常简单了(和使用SQL语句去查询数据表一样的语法)。虽然视图是虚拟表,但它依旧是一张表,可通过Select语句进行查询数据。
(2)向视图插入数据
-- 向视图“view_出版社”插入数据
INSERT INTO `view_出版社`
VALUES('10','上海交通大学出版社','上海交大','上海市1038号','102091'),
('11','西安电子科技大学出版社','西安电子','西安市2000号','110077');
对视图进行插入数据的方式是和对源表的插入数据是一样的。
(3)对视图进行修改数据
-- 修改视图view_出版社
Update view_出版社 Set 出版社地址 = '上海市960号', 邮政编码 = 100132
Where 出版社ID = 5;
如果一个视图依赖于多个源表,则一次修改该视图只能变动一个源表的数据。
(4)删除视图中的数据
-- 删除视图中出版社ID为10,11的数据
DELETE
FROM `view_出版社`
WHERE 出版社ID in ('10','11');
对于依赖于多个源表的视图,不能使用Delete语句删除多个源表中的数据。
2.5、删除视图
删除视图是指删除数据库中已存在的视图,删除视图时,只能删除视图的定义,不会删除源表中的数据。在MySQL中,使用“Drop View”语句来删除视图时,用户必须拥有Drop权限。
删除视图的语法格式如下:
Drop View [if exists] <视图名列表> [Restrict | Cascade];
使用“Drop View”语句一次可以生删除多个视图,各个视图名使用半角逗号“,”分隔。如果使用“if exists”选项,当视图不存在时,不会出现错误提示信息。
-- 例如:删除视图view_图书信息
Drop View view_图书信息;
边栏推荐
- EA&UML日拱一卒-活动图::Feature和StuctualFeature
- Some thoughts on paying for knowledge
- How to merge the code when there is a code conflict in the collaborative development of multiple people?
- gdb调试常用概念整理
- Super young!34-year-old professor, vice president of 985 Ace College!
- 工作效率-十五分钟让你快速学习Markdown语法到精通排版实践备忘
- Redis-NoSql
- 升级 MDK 5.37 后的问题处理: AC6编译选项, printf, 重启失效等
- Bika LIMS 开源LIMS集—— SENAITE的使用(分析/测试、方法)
- Gdb debugging common concepts finishing
猜你喜欢
AI全流程开发难题破解之钥
十种实现延迟任务的方案
MLX90640 红外热成像仪测温传感器模块开发笔记(九)
日志打印不规范,被CTO骂了一顿~
开放式耳机推荐哪款最好最实用、最好的开放式耳机推荐
How to merge the code when there is a code conflict in the collaborative development of multiple people?
gdb调试常用概念整理
国内helm快速安装和添加常用charts仓库
【JS高级】js之闭包对象_04
【论文阅读】Anomaly Detection in Video via Self-Supervised and Multi-Task Learning
随机推荐
【论文阅读】异常检测的视频通过Self-Supervised和多任务学习
即时通讯移动端开发之网络连接优化
How to Improve Embedded Programming with MISRA
马尔可夫跳变线性系统最优控制的研究现状与进展
Project Manager: Not bad!The SSO single sign-on code is written, and the sequence diagram is also drawn?
grid的使用
程序员是职业病高发群体,别天真的以为只有秃头那么简单,才不是呢。
性能优化竟白屏,难道真是我的锅?
MLX90640 红外热成像仪测温传感器模块开发笔记(九)
九种方式,教你读取 resources 目录下的文件路径
Nine kinds of way, teach you to read the resources files in the directory path
开关电源-LLC基本原理
还在开发短信验证码登录?试试(本机号码一键登录)
AI全流程开发难题破解之钥
企业需要知道的5个 IAM 最佳实践
MySQL8.0学习记录21 - 视图
期货合约知多少
2022开放原子全球开源峰会数据库分论坛圆满召开
从KEIL仿真界面导出数据的技巧
Bika LIMS 开源LIMS集—— SENAITE的使用(分析/测试、方法)