视图操作基本语法

  1. 创建视图

    CREATE [OR REPLACE] VIEW 视图名称 [(列名列表)] AS SELECT语句 [WITH [CASCADED | LOCAL] CHECK OPTION]
    • 使用 WITH CHECK OPTION 确保插入、更新或删除操作符合视图的定义条件。
    • CHECK OPTION 包含两种模式:
      • CASCADED:递归检查当前视图及所有依赖视图的条件(默认)。
      • LOCAL:仅检查当前视图的条件。
  2. 查询视图

    • 查看视图的创建语句:
      SHOW CREATE VIEW 视图名称;
    • 查询视图中的数据:
      SELECT * FROM 视图名称;
  3. 修改视图

    • 方式一:重新创建视图
      CREATE [OR REPLACE] VIEW 视图名称 [(列名列表)] AS SELECT语句 [WITH [CASCADED | LOCAL] CHECK OPTION]
    • 方式二:直接使用 ALTER 修改视图
      ALTER VIEW 视图名称 [(列名列表)] AS SELECT语句 [WITH [CASCADED | LOCAL] CHECK OPTION]
  4. 删除视图

    DROP VIEW [IF EXISTS] 视图名称;

检查选项

  • CASCADED 选项会递归检查视图的所有上层条件。
  • LOCAL 选项仅检查当前视图的条件。
  • 如果一个视图没有 CHECK OPTION,则插入或更新数据时不会检查其自身条件,但会检查依赖视图的条件。

WITH CASCADED CHECK OPTION 的详细工作机制

  1. 作用

    • CASCADED CHECK OPTION 会确保数据操作满足当前视图和所有依赖视图(父视图)的条件。
  2. 单层视图

    • 在单层视图中,CASCADEDLOCAL 没有区别,只会检查当前视图的条件。
  3. 多层视图中的条件检查

    • 在多层视图结构中,即使最终视图(如 v3)没有 WITH CHECK OPTION,但如果其上层视图(如 v1v2)有 CASCADED CHECK OPTION,则在 v3 中插入或更新数据时,仍然需要满足上层视图的条件。

    示例

    CREATE VIEW v1 AS SELECT id, name FROM student WHERE id <= 20 WITH CASCADED CHECK OPTION;
    CREATE VIEW v2 AS SELECT id, name FROM v1 WHERE id >= 10 WITH CASCADED CHECK OPTION;
    CREATE VIEW v3 AS SELECT id, name FROM v2 WHERE id <= 15;  -- 没有 WITH CHECK OPTION
    • v1 的条件是 id <= 20,有 CASCADED CHECK OPTION
    • v2 的条件是 id >= 10,有 CASCADED CHECK OPTION
    • v3 的条件是 id <= 15,但没有 WITH CHECK OPTION

    v3 中插入或更新数据时

    • 必须符合 v1v2 的条件(即 id <= 20id >= 10),因为 v2v1 都有 CASCADED CHECK OPTION
    • 不需要检查 v3 的条件id <= 15),因为 v3 没有 WITH CHECK OPTION

查看所有视图

在 MySQL 中,可以通过以下语句查看当前数据库中的所有视图:

SHOW FULL TABLES WHERE Table_type = 'VIEW';

视图的更新条件

为了使视图可更新,视图中的行与基础表中的行必须存在一对一的关系。如果视图包含以下任何一项,则视图不可更新:

  1. 聚合函数或窗口函数(如 SUM()MIN()MAX()COUNT() 等)
  2. DISTINCT
  3. GROUP BY
  4. HAVING
  5. UNIONUNION ALL

视图的作用

  1. 简化
    视图可以简化用户对数据的理解,简化他们的操作。常用的查询可以定义为视图,用户在后续操作时无需重复指定相同的查询条件。

  2. 安全
    数据库可以授予视图权限,但不能授予特定表的特定行或列权限。通过视图,用户只能访问视图中定义的数据,从而提高数据安全性。

  3. 数据独立
    视图可以帮助用户屏蔽真实表结构变化带来的影响,使得数据库结构变化不会影响到用户操作的查询语句。