简单聊聊什么是 MySQL 视图(创建、删除、更新、查询)

视图



1、简介

视图(view)是一种 虚拟存在 的表,是从数据库中一个或多个表中导出来的表,而且在数据库中并不会存放视图对应的数据,只会存放定义!那具体数据呢,当然还是在导出视图的原表中。视图提供 UPDATE、INSERT、DELETE 等基本操作,同时也可以使用 SELECT 语句进行查询


作用(简化、安全、逻辑独立性)

  • 简化用户的操作,因为用户可以将注意点放在关心的数据上,对于不想操作的数据,视图会进行隐藏
  • 对机密数据提供安全保护(通过隐藏机密数据)
  • 让查询(SELECT)变的更加简便,其实这一点可以通过第一点推导
  • 对重构数据库提供了一定程度的逻辑独立性。理解这一点需要大家知道什么是数据的物理独立性和逻辑独立性,但是没关系,本文重点在于视图的应用,磕概念那就得看书

使用注意点

  • 因为视图中的数据依赖于导出视图的表,所以原表数据发生改动,视图中的数据也会发生变化
  • 如果视图包含【聚合函数得到的结果、去重之后得到的结果、分组之后得到的结果、分组过滤之后的结果、UNION 和 UNION ALL 联合查询结果】其中任意一种结构,就不可以更新!

下面我们开始正式使用视图,其实大家并不用担心,视图还是比较容易,注意点我都会在代码中进行注释



2、创建视图

首先我们先准本好基本表 student_information


64

准备好些许数据(数据随便写的):


image-20220111122632822

接下来我们开始创建视图

-- 语法格式,[] 里面可以选择不写
CREATE VIEW `视图名`[`列名1`, `列名2`, ... , `列名n`]
AS 
< 查询语句 >		         -- 实际上就是将查询结果所得的表转换成视图
[WITH CHECK OPTION];	   -- 表示对视图进行 UPDATE、INSERT、DELETE 的时候,操作的行(数据)需要满足查询语句


-- 下面我们给 “计算机科学与技术” 的学生建立视图,而且只显示 id、name、class
CREATE VIEW `Computer science and technology`
AS
-- 下面就是查询语句,就是 SELECT 语句的应用,别忘了结尾的 ; 就行
SELECT `id`, `name`, `class` 
FROM `student_information`
WHERE `professional` = '计算机科学与技术';

视图 Computer science and technology 的内容:

59


可以看到,视图的属性列名就是 SELECT 查询的 id、name、class,当然我们也可以自定义视图列名,但是注意 只能全部自定义或者全部省略,不存在第三种选择 ,下面我们自定义列名

/* 将属性名直接写在视图名后边,可以使用 `` ,但是请不要使用 '' 或 "" 包裹列名

以下几种情况推荐自定义列名,否则别人很可能看不懂你的视图(如果你想挨打,请忽略):
1、查询时使用了聚合函数,例如 COUNT()、MAX()、MIN() 等
2、多表连接时,属性字段相同的部分,例如表 1 有 id 字段,表 2 也有 id 字段,这时候为了区分开来,就需要另起名字 */

CREATE VIEW `Computer science and technology`(`学号`, `姓名`, `班级`)
AS
SELECT `id`, `name`, `class` 
FROM `student_information`
WHERE `professional` = '计算机科学与技术'
WITH CHECK OPTION;

自定义列名的视图:

60



3、删除视图

删除视图,非常的简单,选中 -> 鼠标右键 -> 删除视图(推荐),什么?你要代码, 请看下面:

DROP VIEW `视图名` [CASCADE] 		-- CASCADE 就是级联,代表删除的时候,所有由当前视图导出的其他视图也会被删除

没了,就这么点。哦对了,如果你把导出视图的基本表删除,视图会无法使用,但是还是存在定义,最终还是得手动删除才行



4、更新视图

注意,这里的更新是指数据的更新,而不是视图结构的更新。有些人可能会疑问,明明视图只是一个定义,那哪来的数据呢?其实 视图的更新就是对基本表的更新。我们通过插入(INSERT)、修改(UPDATE)、删除(DELETE)完成修改(实际上就是 DML 语句

-- 1、将 computer science and technology 视图中姓名为“学生1”的学生班级改成 5
UPDATE `computer science and technology`
SET `class` = '5'
WHERE `name` = '学生1';

-- 2、删除 computer science and technology 视图中姓名为“学生2”的学生
DELETE FROM `computer science and technology`
WHERE `name` = '学生2';

更新后视图(执行上边 UPDATE 和 DELETE):

62


基本表(student_information)变化(展示 “计算机科学以技术” 部分):

63



使用 INSERT 约束点就很多了,比方说上面这个视图是无法进行插入操作的,不信的咱可以试一下

INSERT INTO `computer science and technology`
VALUE(13, '学生13', '4');

/* 先说结论,一定会失败!我们分析一下原本的表格结构(student_inforation),其中 id、name、birth、college、professional、class 这些字段是不能为空的,但是在 computer science and technology 视图中,只包含了 id、name、class,其他不能为空的属性并没有出现,那么插入后一定为 NULL,那自然会报错咯
你可能会说:我全部写上不就好了? 答:那我们还要视图干什么!为什么不直接操作原表呢 */

展示报错(doesn’t have a defalut value 没有一个默认值):

65



那么想要在视图中完成 INSERT 操作,必须满足以下两点:

  • 该视图必须是行列子集视图:行列子集视图就是指一个视图从单个表导出,并且只是去掉了某些行和某些列,但是保留了主键

  • 所有非空且无默认值的列都必须出现在该行列子集视图中:这个很好理解,非空的属性字段如果不在视图内,当然会添加失败


其他注意点:不是所有的视图都是可以进行更新的 例如:

  • 使用聚合函数的到的视图
  • 使用 GROUP BU 子句导出视图
  • 使用 DISTINCT 定义的视图

还有很多约束点,就不一一列举。往往这些视图的修改无法反映到基本表上,所以我上边说过,越复杂的视图,修改越困难,不推荐各位去尝试,因为视图的建立就是为了简化操作,那为什么要反其道而行呢?



5、查询视图

视图的查询和基本表完全一样,所以这里就只是演示一下,毕竟 SELECT 语句属于 DQL 的知识点

-- 在 Computer science and technology 视图中查询所有 4 班的学生
SELECT *
FROM `Computer science and technology`
WHERE `class` = '4';			-- 不要忘了 class 是 varchar 类型哦

查询结果:

61

最后做个总结就是,视图确实能给我们带来很多便利,但是请不要把视图当成万能工具,合理运用带来的是简便,滥用…到时候崩溃的是你自己

猜你喜欢

转载自blog.csdn.net/qq_52174675/article/details/122520067