为什么用视图?

视图一方面可以帮我们使用表的一部分而不是所有的表,另一方面也可以针对不同的用户制定不同的查询视图。比如,针对一个公司的销售人员,我们只想给他看部分数据,而某些特殊的数据,比如采购的价格,则不会提供给他。再比如,人员薪酬是个敏感的字段,那么只给某个级别以上的人员开放,其他人的查询视图中则不提供这个字段。
刚才讲的只是视图的一个使用场景,实际上视图还有很多作用。

视图的理解

  • 视图是一种虚拟表,本身是不具有数据的,占用很少的内存空间,它是 SQL 中的一个重要概念。
  • 视图建立在已有表的基础上, 视图赖以建立的这些表称为基表

image-20211006211206990.png

  • 视图的创建和删除只影响视图本身,不影响对应的基表。
  • 向视图提供数据内容的语句为 SELECT 语句, 可以将视图理解为存储起来的SELECT语句
    • 在数据库中,视图不会保存数据,数据真正保存在数据表中。当对视图中的数据进行增加、删除和修改操作时,数据表中的数据会相应地发生变化;反之亦然。
  • 视图,是向用户提供基表数据的另一种表现形式。通常情况下,小型项目的数据库可以不使用视图,但是在大型项目中,以及数据表比较复杂的情况下,视图的价值就凸显出来了,它可以帮助我们把经常查询的结果集放到虚拟表中,提升使用效率。理解和使用起来都非常方便。

    创建视图

    1. CREATE [OR REPLACE]
    2. [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    3. VIEW 视图名称 [(字段列表)]
    4. AS 查询语句
    5. [WITH [CASCADED|LOCAL] CHECK OPTION]
    1. CREATE VIEW 视图名称
    2. AS 查询语句
    :::info 查询的时候也是用SELECT语句,和查普通表一样的用法 :::

    查看视图

    1. SHOW TABLES;
    1. DESC 视图名称;
    2. #或者
    3. DESCRIBE 视图名称;
    1. # 查看视图信息(显示数据表的存储引擎、版本、数据行数和数据大小等)
    2. SHOW TABLE STATUS LIKE '视图名称';
    3. #执行结果显示,注释Comment为VIEW,说明该表为视图,其他的信息为NULL,说明这是一个虚表。
    1. SHOW CREATE VIEW 视图名称;

    更新视图数据

    一般情况下,MySQL支持使用INSERT、UPDATE和DELETE语句对视图中的数据进行插入、更新和删除操作。当视图中的数据发生变化时,数据表中的数据也会发生变化,反之亦然。

要使视图可更新,视图中的行和底层基本表中的行之间必须存在一对一的关系。另外当视图定义出现如下情况时,视图不支持更新操作:

  • 在定义视图的时候指定了“ALGORITHM = TEMPTABLE”,视图将不支持INSERT和DELETE操作;
  • 视图中不包含基表中所有被定义为非空又未指定默认值的列,视图将不支持INSERT操作;
  • 在定义视图的SELECT语句中使用了JOIN联合查询,视图将不支持INSERT和DELETE操作;
  • 在定义视图的SELECT语句后的字段列表中使用了数学表达式子查询,视图将不支持INSERT,也不支持UPDATE使用了数学表达式、子查询的字段值;
  • 在定义视图的SELECT语句后的字段列表中使用DISTINCT聚合函数GROUP BYHAVINGUNION等,视图将不支持INSERT、UPDATE、DELETE;
  • 在定义视图的SELECT语句中包含了子查询,而子查询中引用了FROM后面的表,视图将不支持INSERT、UPDATE、DELETE;
  • 视图定义基于一个不可更新视图
  • 常量视图。

虽然可以更新视图数据,但总的来说,视图作为虚拟表,主要用于方便查询,不建议更新视图的数据。对视图数据的更改,都是通过对实际数据表里数据的操作来完成的。

修改视图

  1. CREATE OR REPLACE VIEW 视图名[(列名)]
  2. AS
  3. 查询语句
  1. ALTER VIEW 视图名称
  2. AS
  3. 查询语句

删除视图

  1. DROP VIEW IF EXISTS 视图名称1,视图名称2,视图名称3,...;
  • 删除视图只是删除视图的定义,并不会删除基表的数据
  • 基于视图a、b创建了新的视图c,如果将视图a或者视图b删除,会导致视图c的查询失败。这样的视图c需要手动删除或修改,否则影响使用。