MySQL视图
MySQL视图
1. 视图的概念
视图(View)是一种虚拟存在的表,并不实际存储数据,而是基于一个或多个基础表(基表)的查询结果生成的。视图的定义存储在数据字典中,每次访问视图时,MySQL 会根据视图中的查询语句动态生成数据。
2. 视图的作用和优点
2.1 简化复杂查询
视图可以将复杂的多表联合查询封装为一个简单的虚拟表,使用者在查询时就不必关心底层表的结构与关联条件。
2.2 数据安全与权限控制
通过视图可以只向用户暴露必要的数据,而将敏感或不相关的信息屏蔽掉。例如,可以为不同的用户创建不同的视图,只显示他们需要的数据,从而达到权限控制的目的。
2.3 数据独立与重用
当基础表结构发生变化时,只需修改视图定义而不必修改应用层的查询,起到一定的数据独立性。视图还可以重用 SQL 语句,避免重复编写复杂查询逻辑。
3. 视图的操作
3.1 创建视图
语法:
create view 视图名 as select ...;
详细创建语法:
create [or replace] [algorithm = {undefined | merge | temptable}]
view view_name [(column_list)]
as select_statement
[with [cascaded | ] check option];
or replace: 若视图已存在则替换。
algorithm: 指定视图使用的算法,默认为 UNDEFINED,MySQL 会自动选择合适的算法。
with check option: 在对视图进行插入、更新操作时,检查操作是否满足视图定义的 WHERE 条件,保证数据安全。
- cascaded(默认):递归检查所有层级的视图定义。适用于 嵌套视图(视图基于另一个视图),确保所有视图定义的条件都满足。
- local:仅检查当前视图的
WHERE
条件,不检查嵌套视图的限制。
3.2 查看视图
可以使用 DESCRIBE
或 SHOW CREATE VIEW
命令查看视图的结构与定义:
desc view_name;show create view view_name\g;
3.3 修改视图
修改视图可以使用 create or replace view
或 alter view
语句。例如,要修改视图显示的字段,可以这样操作:
create or replace view view_name as
select num, name
from worker;
或者:
alter view view_name as
select num, name
from worker;
3.4 删除视图
使用 DROP
删除视图:
drop view if exists view_name;
4. 通过视图或基表修改数据
由于视图是动态生成数据,在基表中对数据进行增、删、改操作,都会在视图中更新;同时,在视图中对数据进行增、删、改操作,也都会对基表数据产生影响。
但不是所有的视图都能对数据进行更改,如果视图中包含聚合函数、DISTINCT、GROUP BY、HAVING、UNION 或子查询等,则该视图通常为只读视图,不能进行插入、更新或删除操作。
同时,如果视图在创建时有 WITH CHECK OPTION 选项,则在使用视图更新数据时,需要满足 WITH CHECK OPTION 的条件才能对数据进行修改。
一般不建议通过视图对数据进行任何增、删、改操作。
5. 视图的其他使用限制
- 视图的查询实际上会转换为对基础表的查询。如果视图中包含复杂的多表联合或嵌套视图,可能会影响查询性能。因此,设计视图时需要注意性能优化。
- 视图不能添加索引,也不能有关联的触发器或默认值。
order by
可以在视图中使用,但是如果从视图检索数据的select
语句中也含有order by
,那么新的order by
会覆盖旧的。