阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

MySQL学习笔记—视图

375次阅读
没有评论

共计 4584 个字符,预计需要花费 12 分钟才能阅读完成。

MySQL 学习笔记—视图


视图是查看基础表数据的一种方式,其作用有

- 简化开发难度,可以运用视图执行多表操作
- 数据安全,开发人员不能直接对表操作,也不能进行删除,修改操作
- 数据重构,在有限的表中,以不同的角度生成所需的视图,简化业务


CREATE VIEW 语法


CREATE VIEW 语法:

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    VIEW view_name [(column_list)]
    AS select_statement
    [WITH [CASCADED | LOCAL] CHECK OPTION]

该语句能创建新的视图,如果给定了 OR REPLACE 子句,该语句还能替换已有的视图。select_statement 是一种 SELECT 语句,它给出了视图的定义。该语句可从基表或其他视图进行选择。

该语句要求具有针对视图的 CREATE VIEW 权限,以及针对由 SELECT 语句选择的每一列上的某些权限。对于在 SELECT 语句中其他地方使用的列,必须具有 SELECT 权限。如果还有 OR REPLACE 子句,必须在视图上具有 DROP 权限。

视图属于数据库。在默认情况下,将在当前数据库创建新视图。要想在给定数据库中明确创建视图,创建时,应将名称指定为

db_name.view_name。

例:

CREATE VIEW test.v AS SELECT * FROM t;

表和视图共享数据库中相同的名称空间,因此,数据库不能包含具有相同名称的表和视图。实际上视图是一个虚表。

视图必须具有唯一的列名,不得有重复,就像基表那样。默认情况下,由 SELECT 语句检索的列名将用作视图列名。要想为视图列定义明确的名称,可使用可选的 column_list 子句,列出由逗号隔开的 ID。column_list 中的名称数目必须等于 SELECT 语句检索的列数。

SELECT 语句检索的列可以是对表列的简单引用。也可以是使用函数、常量值、操作符等的表达式。

对于 SELECT 语句中不合格的表或视图,将根据默认的数据库进行解释。通过用恰当的数据库名称限定表或视图名,视图能够引用表或其他数据库中的视图。

能够使用多种 SELECT 语句创建视图。视图能够引用基表或其他视图。它能使用联合、UNION 和子查询。SELECT 甚至不需引用任何表。在下面的示例中,定义了从另一表选择两列的视图,并给出了根据这些列计算的表达式:

 CREATE TABLE t (seg1 INT, seg2 INT);
 INSERT INTO t VALUES(3, 50);
 CREATE VIEW v AS SELECT seg1 , seg2 , seg1*seg2 AS value FROM t;
 SELECT * FROM v;

显示结果:
MySQL 学习笔记—视图

视图定义服从下述限制:

- SELECT 语句不能包含 FROM 子句中的子查询。

- SELECT 语句不能引用系统或用户变量。

- SELECT 语句不能引用预处理语句参数。

- 在存储子程序内,定义不能引用子程序参数或局部变量。

- 在定义中引用的表或视图必须存在。但是,创建了视图后,能够舍弃定义引用的表或视图。要想检查视图定义是否存在这类问题,可使用 CHECK TABLE 语句。

- 在定义中不能引用 TEMPORARY 表,不能创建 TEMPORARY 视图。

- 在视图定义中命名的表必须已存在。

- 不能将触发程序与视图关联在一起。

在视图定义中允许使用 ORDER BY,但是,如果从特定视图进行了选择,而该视图使用了具有自己 ORDER BY 的语句,它将被忽略。

如果创建了视图,视图中引用了系统变量,通过更改系统变量更改了查询处理环境,会影响从视图获得的结果,一下例子创建了一个包含系统字符集与校对方式信息的视图

create view v as select charset(char(65)) , collation(char(65));

CHARSET(str) 返回字符串自变量的字符集。
>COLLATION(str) 返回字符串参数的排序方式

查看结果:
MySQL 学习笔记—视图

更改字符集再查询结果:

set names 'utf8';
select * from v;

会得到不同的结果:

CHARSET(CHAR(65)) COLLATION(CHAR(65))
utf8 utf8_general_ci

(我的电脑没有办法显示出正确的结果,所以将数据直接贴出来 -_-)

可选的 ALGORITHM 子句是对标准 SQL 的 MySQL 扩展。ALGORITHM 可取三个值:
- MERGE
- TEMPTABLE
- UNDEFINED

如果没有 ALGORITHM 子句,默认算法是 UNDEFINED(未定义的)。算法会影响 MySQL 处理视图的方式。

  • 对于 MERGE,会将引用视图的语句的文本与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分。

  • 对于 TEMPTABLE,视图的结果将被置于临时表中,然后使用它执行语句。

  • 对于 UNDEFINED,MySQL 将选择所要使用的算法。如果可能,它倾向于 MERGE 而不是 TEMPTABLE,这是因为 MERGE 通常更有效,而且如果使用了临时表,视图是不可更新的。

选择 TEMPTABLE 有一个好处,在创建临时表之后、并在完成语句处理之前,能够释放基表上的锁定。与 MERGE 算法相比,锁定释放的速度更快,这样,使用视图的其他客户端不会被屏蔽过长时间。

有三种情况视图算法是 UNDEFINED:

· 在 CREATE VIEW 语句中没有 ALGORITHM 子句。

· CREATE VIEW 语句有 1 个显式 ALGORITHM = UNDEFINED 子句。

· 为仅能用临时表处理的视图指定 ALGORITHM = MERGE。在这种情况下,MySQL 将生成告警,并将算法设置为 UNDEFINED。

正如前面所介绍的那样,通过将视图定义中的对应部分合并到引用视图的语句中,对 MERGE 进行处理。

在下面的示例中,简要介绍了 MERGE 的工作方式。在该示例中,假定有 1 个具有下述定义的视图 v_merge:

CREATE ALGORITHM = MERGE VIEW v_merge (vc1, vc2) AS
       SELECT c1, c2 FROM t WHERE c3 > 100;

示例 1:假定发出了下述语句:

SELECT * FROM v_merge;

MySQL 以下述方式处理语句:

1·         v_merge 成为 t

2·         * 成为 vc1、vc2,与 c1、c2 对应

3·         增加视图 WHERE 子句

所产生的将执行的语句为:

SELECT c1, c2 FROM t WHERE c3 > 100;

示例 2:假定发出了下述语句:

SELECT * FROM v_merge WHERE vc1 < 100;

该语句的处理方式与前面介绍的类似,但 vc1 < 100 变为 c1 < 100,并使用 AND 连接词将视图的 WHERE 子句添加到语句的 WHERE 子句中(增加了圆括号以确保以正确的优先顺序执行子句部分)。所得的将要执行的语句变为:

SELECT c1, c2 FROM t WHERE (c3 > 100) AND (c1 < 100);

事实上,将要执行的语句是具有下述形式的 WHERE 子句:

WHERE (select WHERE) AND (view WHERE)

MERGE 算法要求视图中的行和基表中的行具有一对一的关系。如果不具有该关系。必须使用临时表取而代之。如果视图包含下述结构中的任何一种,将失去一对一的关系:

· 聚合函数(SUM(), MIN(), MAX(), COUNT()等)。

· DISTINCT

· GROUP BY

· HAVING

· UNION 或 UNION ALL

· 仅引用文字值(在该情况下,没有基本表)。如 create view v as select 1 as num;

某些视图是可更新的。也就是说,可以在诸如 UPDATE、DELETE 或 INSERT 等语句中使用它们,以更新基表的内容。对于可更新的视图,在视图中的行和基表中的行之间必须具有一对一的关系。即符合 MERGE 算法的要求。

如果视图包含下述结构中的任何一种,那么它就是不可更新的:

· 聚合函数(SUM(), MIN(), MAX(), COUNT()等)。

· DISTINCT

· GROUP BY

· HAVING

· UNION 或 UNION ALL

· 位于选择列表中的子查询

· Join

· FROM 子句中的不可更新视图

· WHERE 子句中的子查询,引用 FROM 子句中的表。

· 仅引用文字值(在该情况下,没有要更新的基本表)。

· ALGORITHM = TEMPTABLE(使用临时表总会使视图成为不可更新的)。

例如我的数据库中有一个 t_user 的表,我建立其一对一的视图:
MySQL 学习笔记—视图

可以看到当我改变视图中的数据时,视图对应的基本表也会相应地改变:

MySQL 学习笔记—视图

如果我再创建 t_user 的非一对一视图,可看到视图的不可改变的:
MySQL 学习笔记—视图

MySQL 学习笔记—视图

对于可更新视图,可给定 WITH CHECK OPTION 子句来防止插入或更新行,除非作用在行上的 select_statement 中的 WHERE 子句为“真”。即插入的数据符合 select_statement 中的 WHERE 的要求才可以插入。

在关于可更新视图的 WITH CHECK OPTION 子句中,当视图是根据另一个视图定义的时,LOCAL 和 CASCADED 关键字决定了检查测试的范围。
LOCAL 关键字对 CHECK OPTION 进行了限制,使其仅作用在定义的视图上,
CASCADED 会对将进行评估的基表进行检查。如果未给定任一关键字,默认值为 CASCADED。CASCADED 的意思为级联。

下面创建 v1,v2,v3 三个视图:

 CREATE TABLE t1 (a INT);
 CREATE VIEW v1 AS SELECT * FROM t1 WHERE a < 2
     WITH CHECK OPTION; #创建 t 表的一对一视图

 CREATE VIEW v2 AS SELECT * FROM v1 WHERE a > 0
     WITH LOCAL CHECK OPTION;

 CREATE VIEW v3 AS SELECT * FROM v1 WHERE a > 0
     WITH CASCADED CHECK OPTION;

这里,视图 v2 和 v3 是根据另一视图 v1 定义的。
v2 具有 LOCAL 检查选项,因此,仅会针对 v2 检查对插入项进行测试,即只考虑 v2 的 WHERE 语句的限制要求。
v3 具有 CASCADED 检查选项,因此,不仅会针对它自己的检查对插入项进行测试,也会针对基本视图的检查对插入项进行测试。
从下面的结果看到,插入相同的数据,结果却不相同:

MySQL 学习笔记—视图

这是因为插入 v2 时,只会查询 WHERE a > 0
插入 v3 的还会,会查询 WHERE a > 0 与 v1 的WHERE a < 2,所以数字 2 无法插入。


DROP VIEW 语法


DROP VIEW 语法

DROP VIEW [IF EXISTS]
    view_name [, view_name] ...
    [RESTRICT | CASCADE]

DROP VIEW 能够删除 1 个或多个视图。必须在每个视图上拥有 DROP 权限。

可以使用关键字 IF EXISTS 来防止因不存在的视图而出错。


SHOW CREATE VIEW 语法


SHOW CREATE VIEW 语法

SHOW CREATE VIEW view_name

该语句给出了 1 个创建给定视图的 CREATE VIEW 语句。

例如查询 v3 视图:

MySQL 学习笔记—视图

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-10/136281.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计4584字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19350
评论数
4
阅读量
7966251
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸 前言 作为天天跟架构图、拓扑图死磕的...
星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

  星哥带你玩飞牛 NAS-16:飞牛云 NAS 换桌面,fndesk 图标管理神器上线! 引言 哈...
国产开源公众号AI知识库 Agent:突破未认证号限制,一键搞定自动回复,重构运营效率

国产开源公众号AI知识库 Agent:突破未认证号限制,一键搞定自动回复,重构运营效率

国产开源公众号 AI 知识库 Agent:突破未认证号限制,一键搞定自动回复,重构运营效率 大家好,我是星哥,...
从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统

从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统

从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统 大家好,我是星哥。公司的项目文档存了一堆 ...
【1024程序员】我劝你赶紧去免费领一个AWS、华为云等的主机

【1024程序员】我劝你赶紧去免费领一个AWS、华为云等的主机

【1024 程序员】我劝你赶紧去免费领一个 AWS、华为云等的主机 每年 10 月 24 日,程序员们都会迎来...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
星哥带你玩飞牛NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手!

星哥带你玩飞牛NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手!

星哥带你玩飞牛 NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手! 作为动漫爱好者,你是否还在为...
星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

星哥带你玩飞牛 NAS 硬件 02:某鱼 6 张左右就可拿下 5 盘位的飞牛圣体 NAS 前言 大家好,我是星...
每年0.99刀,拿下你的第一个顶级域名,详细注册使用

每年0.99刀,拿下你的第一个顶级域名,详细注册使用

每年 0.99 刀,拿下你的第一个顶级域名,详细注册使用 前言 作为长期折腾云服务、域名建站的老玩家,星哥一直...
星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的NAS中!

星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的NAS中!

星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的 NAS 中! 大家对「数据安全感」的需求越来越高 ...
星哥带你玩飞牛NAS-11:咪咕视频订阅部署全攻略

星哥带你玩飞牛NAS-11:咪咕视频订阅部署全攻略

星哥带你玩飞牛 NAS-11:咪咕视频订阅部署全攻略 前言 在家庭影音系统里,NAS 不仅是存储中心,更是内容...