MySQL视图(VIEW)

igxiaoshan Lv5

常见的数据库对象

对象 描述
表(TABLE) 表是存储数据的逻辑单元,以行和列的形式存在,列就是字段,行就是记录.
数据字典 就是系统表,存在数据库相关信息的表.系统表的数据通常由数据库系统维护,程序员通常不修改,只做查看
约束(CONSTRAINT) 执行数据校验的规则,用于保证数据完整性的规则
视图(VIEW) 一个或者多个数据表里的数据的逻辑显示,视图并不存储数据
索引(INDEX) 用于提高查询性能,相当于书的目录
存储过程(PROCEDURE) 用于完成一次完整的业务处理,没有返回值,但可以通过传出参数将多个值传给调用环境
存储函数(FUNCTION) 用于完成一次特定的计算,具有一个返回值
触发器(TRIGGER) 相当于一个事件监听器,当数据库发生特定事件后,触发器被触发,完成相应的处理

视图概述

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

创建视图

1
2
3
4
5
6
7
8
9
10
-- 在 CREATE VIEW 语句中嵌入子查询
CREATE [OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW 视图名称 [(字段列表)]
AS 查询语句
[WITH [CASCADED|LOCAL| CHECK OPTION]

-- 精简版
CREATE VIEW 视图名称
AS 查询语句

查询视图

1
2
3
4
5
6
7
8
9
10
11
12
-- 查看数据库的表对象,视图对象
SHOW TABLES;

-- 查看视图结构
DESC / DESCRIBE 视图名称;

-- 查看视图的属性信息
SHOW TABLE STATUS LIKE '视图名称'\G; # 执行结果显示,注释Commet为VIEW,说明改表为视图,其他信息为NULL,说明这是一个虚表

-- 查看视图的详细定义信息
SHOW CREATE VIEW 视图名称;

视图更新数据

MySQL支持使用INSERT,UPDATE,DELETE语句对视图中的数据进行新增,修改和删除等操作.当视图中数据发生变化时,数据表中的数据也会发生变化,反之亦然.

1
2
3
4
5
6
-- 操作demo自行测试

-- 先建立一个数据表,添加数据进去
-- 在创建一个视图
-- 对视图的数据进行增加,修改,删除等操作对比基表的数据变化
-- 对基表的数据进行增加,修改,删除等操作对比视图的数据变化

不可更新的视图

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

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

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

修改,删除视图

修改视图

1
2
3
4
5
6
7
8
9
10
-- 方式一: 使用CREATE OR REPLACE VIEW 子句 修改视图
CREATE OR REPLACE VIEW '视图名称'
(字段列表)
AS
(查询语句); # CREATE VIEW 子句中各列的别名应和子查询中各列相对应

-- 方式二: ALTER VIEW
ALTER VIEW 视图名称
AS
查询语句;

删除视图

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

总结

优点

  • 操作简单
    • 将经常使用的查询操作定义为视图,可以极大简化开发人员对数据库的操作
  • 减少数据冗余
    • 视图跟实际数据表不一样,它存储的是查询语句.所以,在使用的时候,我们通过定义视图的查询语句来获取结果集.而视图本身不存储数据,不占用数据存储的资源,减少数据冗余
  • 数据安全
    • MySQL将用户对数据的访问限制在某些数据的结果集上.隔离了真实数据表