1. 视图概念
简单来说,视图就是一个预定义的查询语句。视图在许多情况下可以当作表来使用,因此也被称为虚拟表(Virtual Table
)。
视图与表最大的区别在于它不包含数据,数据库中只存储视图的定义语句。
视图提供了一种 MySQL
的 SELECT
语句层次的封装,可用来简化数据处理以及重新格式化基础数据或保护基础数据。
2. 视图优缺点
2.1 优点
-
替代复杂查询,减少复杂性。
将复杂的查询语句定义为视图,然后使用视图进行查询,可以隐藏具体的实现; -
提供一致性接口,实现业务规则。
在视图的定义中增加业务逻辑,对外提供统一的接口;当底层表结构发生变化时,只需要修改视图接口,而不需要修改外部应用,可以简化代码的维护并减少错误; -
控制对于表的访问,提高安全性。通过视图为用户提供数据访问,而不是直接访问表;同时可以限制允许访问某些敏感信息,例如身份证号、工资等。
2.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
实现相同的功能。
MySQL
和SQL Server
还支持使用ALTER VIEW view_name AS select_statement
; 命令修改视图的定义。
Oracle
和PostgreSQL
中的ALTER VIEW
命令用于修改视图的其他属性。
5. 删除视图
使用 DROP VIEW
命令可以删除一个视图:
DROP VIEW [IF EXISTS] view_name;
指定 IF EXISTS
选项后,删除一个不存在的视图时也不会产生错误。Oracle
不支持 IF EXISTS
选项。
6. 可更新视图
可更新视图是指通过视图更新底层表,对于视图的 INSERT
、UPDATE
、DELETE
等操作最终会转换为针对底层基础表的相应操作。可更新视图的定义需要满足许多限制条件,包括:
- 不能使用聚合函数或窗口函数,例如
AVG
、SUM
、COUNT
等; - 不能使用
DISTINCT
、GROUP BY
、HAVING
子句; - 不能使用集合运算符,例如
UNION
、INTERSECT
等; - 修改操作只能涉及单个表中的字段,不能同时修改多个表;
- 不同数据库实现的其他限制条件。
总之,对视图的修改只有在能够映射为对基础表的修改时,数据库才能执行视图的修改操作。