MySQL基础 [九] - 视图特性

目录

视图的概念

视图的操作

准备测试表

创建视图

修改视图影响基表

修改基表影响视图

删除视图

视图规则和限制

实战OJ


视图的概念

在 MySQL 中,"视图"是一种 虚拟表,它是基于一个或多个数据库表的查询结果。视图 并不实际存储数据,而是存储了一个查询的定义(即 select 语句),每当查询视图时,实际的数据都是从基础表中获取的。

​创建视图的主要目的是简化复杂的查询操作和隐藏基础表的结构,从而提供更简洁、易于理解的数据接口。通过使用视图,可以将复杂的查询逻辑抽象为一个命名的实体,使得查询和数据操作更加方便和有效。

​同真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会影响到视图。

视图的操作

准备测试表

下面用员工表和部门表作为测试表,员工表中的ename代表的是员工的姓名,deptno代表的是员工所在部门的部门号。如下:

部门表中的dname代表的是部门名,deptno代表的是部门的部门号。如下:

创建视图

create view 视图名 as 
	select语句;
  • 创建视图时会先执行select语句,然后用查询得到的结果来创建视图。

当我们要查询每个员工其对应的部门名称时,需要使用员工表部门表进行多表查询,并筛选出员工的部门号等于部门的部门号的记录。如下:

如果该查询结果会被频繁用到,那我们就可以给上述查询结果创建视图,创建完毕后通过show命令就能看到这个视图。如下: 

并且在数据库对应的目录下,会增加一个对应的 xxx.frm 文件,但并没有与之对应的 xxx.ibd 文件,这也证明了视图和基表使用的是同一份数据。如下: 

创建视图后就可以直接通过查询视图,来查看每个员工及其对应的部门名称了。如下:

修改视图影响基表

通过查询员工表,可以看到员工CLARK所在部门的部门号为10。如下:

进一步查询部门表,可以看到10号部门的部门名称为ACCOUNTING。如下:

在视图中将员工CLARK所在部门的部门名改为HR后,会看到其他一些员工所在部门的部门名也变为HR了。如下:

根本原因就是因为视图和基表使用的是同一份数据,将视图中CLARK所在部门的部门名改为HR后,部门表中10号部门的部门名也就变成HR了。如下:

而位于10号部门的员工同时还有KING和MILLER,因此修改后再次查询视图时,这两个员工对应的部门名也会变为HR。如下:

修改基表影响视图

通过查询员工表,可以看到员工JAMES所在部门的部门号为30。如下:

30号部门的部门名为SALES,因此查询视图时可以看到JAMES所在的部门名为SALES。如下:

现在将员工表中,员工JAMES对应的部门号改为20。如下:

修改后再查询视图,就会发现JAMES所在部门的部门名,变成了20号部门的部门名RESEARCH。如下:

删除视图

语法

drop view 视图名;

比如将刚才创建的视图删除后,在数据库中就看不到这个视图了。如下:

 并且该视图在数据库目录下对应的 xxx.frm文件 也会被删除。如下:

视图规则和限制

  • 与表一样,视图必须唯一命名(不能出现同名视图或表名)
  • 创建视图数目无限制,但要考虑复杂查询创建为视图之后的性能影响
  • 视图不能添加索引,也不能有关联的触发器或者默认值
  • 视图可以提高安全性,必须具有足够的访问权限
  • order by 可以用在视图中,但是如果从该视图检索数据 select 中也含有 order by,那么 该视图中的 order by 将被覆盖
  • 视图可以和表一起使用
  • 视图的数据变化会影响到基表,基表的数据变化也会影响到视图。

实战OJ