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:
Comment属性的值为VIEW,说明view_category_goods为视图,其他信息为NULL,说明视图是一张虚拟表。而实际表会显示数据表的存储引擎、版本、数据行数和数据大小等信息。
使用SHOW CREATE VIEW语句查看视图
MySQL中会将视图的信息存储到information_schema数据库下的views数据表中,可以查看views数据表来查看视图的信息。
eg:
(三)修改视图:
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】;