1. 视图概念

简单来说,视图就是一个预定义的查询语句。视图在许多情况下可以当作表来使用,因此也被称为虚拟表(Virtual Table)。

视图与表最大的区别在于它不包含数据,数据库中只存储视图的定义语句。

mysql 视图 分组 性能 mysql视图优点_删除视图


视图提供了一种 MySQLSELECT 语句层次的封装,可用来简化数据处理以及重新格式化基础数据或保护基础数据。

2. 视图优缺点

2.1 优点

  1. 替代复杂查询,减少复杂性。
    将复杂的查询语句定义为视图,然后使用视图进行查询,可以隐藏具体的实现;
  2. 提供一致性接口,实现业务规则。
    在视图的定义中增加业务逻辑,对外提供统一的接口;当底层表结构发生变化时,只需要修改视图接口,而不需要修改外部应用,可以简化代码的维护并减少错误;
  3. 控制对于表的访问,提高安全性。通过视图为用户提供数据访问,而不是直接访问表;同时可以限制允许访问某些敏感信息,例如身份证号、工资等。

2.2 缺点

  1. 不当的使用可能会导致性能问题
    视图的定义中可能包含了复杂的查询,例如嵌套的子查询和多个表的连接查询,可能导致使用视图进行查询时性能不佳;
  2. 视图通常用于查询操作,可更新视图(Updatable View)需要满足许多限制条件。可更新视图可以支持通过视图对底层表进行增删改的操作。

3. 创建视图

CREATE VIEW 视图名称 (视图列名1,视图列名2)
AS 
SELECT语句

eg:

CREATE VIEW product_sum (product_type, cnt_product)
AS
SELECT product_type, COUNT(*) FROM product GROUP BY product_type;

使用视图

SELECT product_type, cnt_product FROM product_sum;

应该避免在视图的基础上创建视图,因为多重视图会降低 SQL 的性能;定义视图时不要使用 ORDER BY 子句。

建议最好不要在视图的定义中使用 ORDER BY,因为这种排序并不能保证最终结果的顺序;而且可能由于不必要的排序降低查询的性能。

4. 修改视图

如果需要修改视图的定义,可以删除并重新创建视图。除此之外,各种数据库也提供了直接替换视图定义的命令:

-- Oracle、MySQL 以及 PostgreSQL 实现
CREATE OR REPLACE VIEW view_name
    AS select_statement;

-- SQL Server 实现
CREATE OR ALTER VIEW view_name
    AS select_statement;

其中 CREATE OR REPLACE VIEW 表示如果视图不存在,创建视图;如果视图已经存在,替换视图。SQL Server 使用 CREATE OR ALTER VIEW 实现相同的功能。

MySQLSQL Server 还支持使用 ALTER VIEW view_name AS select_statement; 命令修改视图的定义。
OraclePostgreSQL 中的 ALTER VIEW 命令用于修改视图的其他属性。

5. 删除视图

使用 DROP VIEW 命令可以删除一个视图:

DROP VIEW [IF EXISTS] view_name;

指定 IF EXISTS 选项后,删除一个不存在的视图时也不会产生错误。Oracle 不支持 IF EXISTS 选项。

6. 可更新视图

可更新视图是指通过视图更新底层表,对于视图的 INSERTUPDATEDELETE 等操作最终会转换为针对底层基础表的相应操作。可更新视图的定义需要满足许多限制条件,包括:

  • 不能使用聚合函数或窗口函数,例如 AVGSUMCOUNT 等;
  • 不能使用 DISTINCTGROUP BYHAVING 子句;
  • 不能使用集合运算符,例如 UNIONINTERSECT 等;
  • 修改操作只能涉及单个表中的字段,不能同时修改多个表;
  • 不同数据库实现的其他限制条件。

总之,对视图的修改只有在能够映射为对基础表的修改时,数据库才能执行视图的修改操作。