MySQL从5.0版本开始支持视图。视图时虚拟存在在,和表一样有行和列,但是不实际存在于数据库中。数据库只存放视图的定义,数据都存放在视图定义的数据表中。

视图的优缺点:

1.操作简单:将经常使用的查询操作定义为视图,可以使开发人员不需要关心视图对应的数据表的结构、表与表之间的关联关系,也不需要关心数据表之间的业务逻辑和查询条件,而只需要简单地操作视图即可。

2.数据安全:可以根据权限将用户对数据的访问限制在某些视图上,而不必直接查询或操作数据表,这在一定程度上保障了数据表中数据的安全性。

3.数据独立:图创建完成后,视图的结构就被确定了,当数据表的结构发生变化时不会影响视图的结构。当数据表的字段名称发生变化时,只需要简单地修改视图的查询语句即可,而不会影响用户对数据的查询操作。

4.适应灵活多变的需求:当业务系统的需求发生变化后,如果需要改动数据表的结构,则工作量相对较大,可以使用视图来减少改动的工作量。这种方式在实际工作中使用得比较多。

5.能够分解复杂的查询逻辑:数据库中如果存在复杂的查询逻辑,则可以将问题进行分解,创建多个视图获取数据,再将创建的多个视图结合起来,完成复杂的查询逻辑。

(一)创建视图语句:

CREATE 【OR REPLACE】【ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}】

【DEFINER = user】 【SQL SECURITY { DEFINER | INVOKER }】

VIEW view_name 【(column_list)】

AS select_statement 【WITH 【CASCADED | LOCAL】 CHECK OPTION】;

【ALGORITHM】:标识视图使用的算法。

·{UNDEFINED | MERGE | TEMPTABLE}:视图使用的算法。其中,UNDEFINED表示MySQL会自动选择算法;MERGE表示将引用视图的语句与视图定义进行合并;TEMPTABLE表示将视图的结果放置到临时表中,接下来使用临时表执行相应的SQL语句。

【DEFINER】:定义视图的用户。

【SQL SECURITY】:安全级别。DEFINER表示只有创建视图的用户才能访问视图;INVOKER表示具有相应权限的用户能够访问视图。

【view_name】:创建的视图名称。

【column_list】:视图中包含的字段名称列表。

【select_statement】:SELECT语句。

【WITH [CASCADED | LOCAL] CHECK OPTION】:保证在视图的权限范围内更新视图。

(二)查看视图:

使用SHOW TABLES语句查看视图

使用DESCRIBE/DESC语句查看视图

使用SHOW TABLE STATUS语句查看视图

SHOW TABLE STATUS LIKE 'view-name' \G

eg:

mysql视图和union all哪个速度快 mysql 视图优点_数据

Comment属性的值为VIEW,说明view_category_goods为视图,其他信息为NULL,说明视图是一张虚拟表。而实际表会显示数据表的存储引擎、版本、数据行数和数据大小等信息。

 使用SHOW CREATE VIEW语句查看视图

mysql视图和union all哪个速度快 mysql 视图优点_学习_02

MySQL中会将视图的信息存储到information_schema数据库下的views数据表中,可以查看views数据表来查看视图的信息。

eg:

mysql视图和union all哪个速度快 mysql 视图优点_数据库_03

 (三)修改视图:

CREATE【OR REPLACE】【ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}】

【DEFINER = user】 【SQL SECURITY { DEFINER | INVOKER }】

VIEW view_name 【(column_list)】

AS select_statement 【WITH 【CASCADED | LOCAL】 CHECK OPTION】;

直接使用创建索引的语句就可以修改,或者

ALTER
      【ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}】
      【DEFINER = user】
      【SQL SECURITY { DEFINER | INVOKER }】
      VIEW view_name 【(column_list)】
      AS select_statement
      【WITH 【CASCADED | LOCAL】 CHECK OPTION】;

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

使用INSERT语句进行插入操作的视图必须能够在基表(组成视图查询的表)中插入数据,否则会操作失败。当我们给数据基本表插入新数据时,视图也会同步插入数据。

并且不能在一个语句中对多个基础表使用数据修改语句。所以如果要向一个引用了多个数据表的视图添加数据时,必须使用多个INSERT语句进行添加。

(四)删除视图

DROP VIEW 【IF EXISTS】 view_name 【, view_name】 ... 【RESTRICT | CASCADE】;