MySQL 视图

作者 : admin 本文共2311个字,预计阅读时间需要6分钟 发布时间: 2024-06-9 共3人阅读

本篇主要介绍MySQL视图相关的内容。

目录

一、什么是视图?

二、视图的语法

创建视图

查询视图

更新视图

删除视图

三、检查选项 

未开启检查选项

开启检查选项 

Local

CASCADED

四、视图的更新 

五、视图的作用


一、什么是视图?

视图是一种虚拟存在的表,视图中的数据在数据库中并不存在,它的数据全部来自定义使用时查询的表,并且数据是在使用视图时动态从表中获取的,因此视图中只保存了查询语句的SQL逻辑,不包含查询的结果。简单来说,视图就是能够获取查询语句的查询结果的虚拟表。

二、视图的语法

创建视图

视图创建的语法如下:

create [or replace] view  视图名称 as 查询语句 [with [local | cascaded] check option];

其中replace何更新视图有关,with则与 视图更新时的数据检查有关。

查询视图

对于视图的查询,我们可以查询创建视图的查询语句以及视图中的数据。具体如下:

查看查询语句:

show create view 视图名称;

查询视图中的数据:

select 字段名 from 视图名 判断条件 

更新视图

我们可以对视图中的数据进行更新,具体语句如下:

使用前面的replace:

create or replace view  视图名称 as 查询语句 [with [local | cascaded] check option];

这条语句能够自动去判断当前是要去更新视图还是创建视图。

还有一种则是使用alter,这种方式能够部分修改视图中的内容:

alter view 视图名称(列名….) as 查询语句 [with [local | cascaded] check option];

删除视图

对于视图的删除,我们可以一次删除一个视图,也可以一次批量删除多个视图,语句如下:

drop view [if exists]  视图名称[,视图名称….];

三、检查选项 

接下来,我们来了解一下创建视图时的检查选项。

在使用视图时,我们可以往视图中插入数据(直接将视图当成表,然后像插入表一样插入视图即可,但无论什么数据都能成功插入基表吗?这就与视图是否开启视图检查选项有关系了,对于插入视图中的数据如果检查选项开启则插入的数据需要满足创建视图时的查询语句的判断条件才能插到视图的基表中,如果未开启则不需要满足,每次插入视图都能直接插入基表。)

未开启检查选项

我们先来看一下没有开启检查选项的情况。

我们先创建一个视图,并给查询语句加上判断条件

MySQL 视图插图

此时我们尝试给视图插入一条age为9的数据MySQL 视图插图(1) 

 可以发现数据插入成功,我们去视图查询一下:

MySQL 视图插图(2)

可以发现视图中并不包含我们新插入的数据,这是因为只有符合查询语句的判断条件的数据才能插入到视图中。

我们再打开视图的基表来看一下:
MySQL 视图插图(3) 

可以发现数据插入到基表中了。但我们通常不希望通过视图操作判断条件外的数据,因此,我们需要对视图开启检查选项。

开启检查选项 

开启检查选项后,对于当前视图执行插入操作时,只有符合判断条件的数据才能成功插入到基表中。在检查选项中,需要设置成local或者cascaded,这两者在当前视图没有基于其它视图创建时,效果是一样的。什么是基于其它视图创建呢?具体来说就是在创建视图时,查询语句中查询的表不是真的表,而是另一个视图,例如我们创建一个基于前面的视图的视图:

MySQL 视图插图(4)下面我们来看一下local和cascaded在视图基于视图的情况下的区别:

Local

如果开启的检查选项为local,则只会对开启了检查选项的视图或者关联的视图(创建时基于的视图)进行检查,例如:

前面我们创建视图v_u的语句如下:MySQL 视图插图

v_u_1是基于v_u创建的 

MySQL 视图插图(5)

且开启了检查选项,且为local ,因此当我们插入数据时只需要满足v_u_1的判断条件就能插入成功,例如我们插入age为9的数据:

MySQL 视图插图(6)

查看基表:

MySQL 视图插图(7) 

可以发现数据插入成功了。

如果关联的视图中也开启了检查的选项,则需要同时满足当前视图和关联的视图中的判断条件才能成功将数据插入基表。如果不满足判断条件时则会在插入时报错:

MySQL 视图插图(8)

CASCADED

cascaded与local不同,无论当前视图关联的视图有没有开启检查选项,在数据插入时都需要同时满足当前视图和关联视图的判断条件才能成功插入基表。

例如我们删除v_u_1,然后重新创建,并指定检查选项为cascaded:

MySQL 视图插图(9)

此时我们再插入age为9的数据:

MySQL 视图插图(10) 

可以发现插入失败了,因为9不满足v_u的判断条件。

我们再插入age为7的数据试试:

MySQL 视图插图(11)

可以发现插入成功了。

四、视图的更新 

 视图中每一行数据都与基表中的行一一对应,因此如果创建视图时的查询语句包含下面任意一个内容,视图都将无法更新(增删改):

  • 函数(count,max,avg,min等函数)
  • having
  • distinct
  • group by
  • union 、union all

例如下面这个视图MySQL 视图插图(12) 

如果我们往这个视图插入数据就会报错:

 MySQL 视图插图(13)

五、视图的作用

通过上面对于视图的介绍,可以总结出视图有如下三个方面的优点:

简单

通过视图可以简化一些复杂的联表查询 ,并且在查询时,我们可以只指定部分查询条件,剩下的查询条件可以包含在视图里,视图也能让我们能够更好的理解一些复杂的查询sql。

安全

在MySQL中,对于用户的使用授权只能授权到数据库上,而不能授权到表中的某些字段上,但通常情况下,部分表中的字段是不能被授权的,例如银行密码等,因此我们可以给用户授权使用某个视图,这个视图中只包含能够被授权访问的字段,这样就能实现授权到某些字段了,从而提升安全性。

数据独立

视图中的结构可以不受表结构的变化影响,例如表中的字段名发生了修改,我们只需要在创建视图时,将该字段起一个别名即可,然后在web项目中我们通过视图进行查询,这样就避免了实体类的属性名的修改。

 

 

 

 

本站无任何商业行为
个人在线分享 » MySQL 视图
E-->