一、视图的概念

简单来说视图(View)就是从一个或者多个表中导出你想要的数据,新组合成的一个表 ,但是视图是一个虚表,意思就是它所对应的数据并不会被实际的存储起来,数据库中只存视图的定义,对视图的数据进行操作时,系统根据视图的定义去操作与视图相关联的基本表。

视图被定义之后,就能像表那样被查询、修改、删除和更新了。

使用视图有以下几个优点:

  1. 为用户集中数据,简化用户的数据查询和处理。在用户使用产品过程中,可能会需要多个表中的数据,定义了视图后可以将这些数据集中在一起,从而方便了用户的数据查询和处理。
  2. 屏蔽数据库的复杂性。定义了视图之后,用户就不用了解复杂的数据库中表的结构了,并且数据库表的更改也不影响用户对数据库的使用。
  3. 简化用户权限的管理。在定义视图之后只需要授予用户使用视图的权限了,而不必指定用户只能使用表的指定列了,也增加了安全性。
  4. 便于数据共享。使用视图之后各个用户就不必都定义和存储自己所需的数据了,可共享数据库的数据,这样做可以使同样的数据只存储一次了。
  5. 可以重新组织数据以便输出到其他应用程序中。

二、创建视图

视图在数据库中是作为一个对象来存储的。用户创建视图前,要保证自己已被数据库所有者授权可以使用create view语句,并且有权操作视图所涉及的表或其他视图,其语法格式如下:

create [or replace] view 视图名 [(列名...)]
as select 语句

格式内容说明

  • or replace:能够替换已有的同名视图。
  • 列名...:为视图的列定义明确的名称,列名由逗号隔开。列名数目必须等于select语句检索的列数。若使用与源表或视图中相同的列名则可以省略列名。
  • select语句:用来创建视图的select语句,可在select语句中查询多个表或视图。

其中对select语句以下限制:

  1. 定义视图的用户必须对所参照的表或视图有查询(即可执行select语句)的权限。
  2. 不能包含from子句的子查询。
  3. 在定义中引用的表或视图必须存在。
  4. 若引用不是当前数据库的表或视图时,要在表或视图前加上数据库的名称。
  5. 在视图定义中允许使用order by ,如果从特定视图进行了选择,而该视图使用了具有自己order by 的语句,则视图定义中的order by将被忽略。
  6. 对应select语句中的其他选项或子句,若视图中也包含了这些选项,则效果未定义。例如:如果在视图定义中包含limit子句,而select语句使用了自己的limit子句,mysql对使用哪个limit未明确定义。

实例,当前数据库为test,创建test数据库上的stumess视图,包括了选择了MySQL这个学科各学生的学号、姓名、成绩、课程号、课程名,如下:

create or replace view test.cscj
     as
     select stumess.stuNum,stumess.stuName,performance.stuper,performance.couNum,course.couName
     from test.stumess,test.performance,test.course
     where stumess.stuNum = performance.stuNum and course.couNum = performance.couNum and performance.couNum = '01105'
     with check option;

这里特别说明一下create or replace view test.cscj这一段,test是你已有的数据库,不是新创建的,而cscj这个才是你要创建的视图名,后面查询就用‘cscj’这个名,由于小编在学习的时候就经常以为test是新创建的,就一直死脑筋的去看其他的,就没有想到要用已有的,或许你比我聪明哦,这里只是把我学习中遇到的问题提一下。

执行结果如下图

MySQL视图-技术中文网

三、查询视图

查询上一步创建的视图,如下

 select * from cscj;

执行结果如下

MySQL视图-技术中文网

也可以进行条件比如查询分数大于80且小于90的学生信息,如下

 select * from cscj
    -> where stuper > 80 and stuper <90;

执行结果如下

MySQL视图-技术中文网

当创建好了一个视图后,后面的操作和操作数据库中的表一样的,视图很简单,就是最开始的理解有点难,当你理解了前面你会发现后面很简单。