视图
Last updated
Last updated
视图是一个虚拟表,其内容来自对表查询的基础上
视图的行和列数据来自于定义视图的查询所引用的表,并在引用表时动态生成
视图的结构和显示的数据行并没有实际地以视图结构存储在数据库中,而是存储在视图所引用的基本表中
视图集中、简化和自定义每个用户对数据库的不同认识,是数据库的外模式。用户可以将数据库中自己感兴趣的特定数据展现在视图中。
视图也可以作为一种安全机制,允许用户通过视图访问数据,而不授予用户直接访问视图基础表的权限
view_name
:为新创建的视图指定的名字,视图名称必须符合标识符原则。
column_name
:在视图中包含的列名,也可以在select
语句中指定列名
table_name
:视图基表的名字
select_statement
:选择哪些列进入视图的select
语句。
where search_condition
:基表数据进入视图所应满足的条件。
with check_option
:迫使通过视图执行的所有数据修改语句必须符合视图定义中设置的条件。
在创建视图时,应首先测试select语句以确保能够返回正确的结果
创建视图的步骤:
编写用于创建视图的select
语句。
对select
语句进行测试。
检查测试结果是否正确,是否和预期的一样。
创建视图。
视图的常见用法是限制用户只能存取表中的某些数据行,用这种方法产生的视图称为水平视图,即表中行的子集。
如果限制用户只能存取表中的部分列数据,那么使用这种方法创建的视图就称为投影视图,即表中列的子集。
使用视图的一个原因是简化多表查询,可以生成从多个表中提取数据的联合视图(joined view) 把查询结果表示为一个单独的“可见表”。
MySQL:desc view_name
SQL:sp_help view_name
和创建视图基本类似,保留视图名称,换了查询语句。
对视图的查询和对基本表查询一样;
系统执行视图查询时是把它转换成等价的对基本表的查询;
对视图的更新最终要转换成对基本表的更新。
视图的更新条件:
视图必须未涉及连接;(涉及了多个表)
视图必须不包含Group by
子句;(不是表原始的内容)
视图不能包含任何组合函数;(不是表原始的内容)
不能使用distinct
子句;(删除了部分表的内容)
where
子句不能包含表的嵌套引用;(涉及了多个表)
Oracle支持物化视图,MySQL、SQL Server不支持物化视图。
视图的优点
查询的简单性:将复杂的查询定义为视图,保留用户所关心的数据内容,简化用户浏览和操作;
安全保护:视图可以设置不同用户对数据的访问权限;
屏蔽数据的复杂性:简化用户对数据库的操作,还可以使用视图重新组织数据;
视图的缺点
性能降低
修改的限制
视图是简化设计、清晰编码的东西,并不是提高性能的,它的存在只会降低性能。
普通视图就是一个虚拟表,不占磁盘空间
物化视图是存在的,占内存
普通视图的查询实际上还是对SQL的查询,并不能提高性能,只是看起来直观、简便
物化视图是对查询结果的预运算,用于需要对查询立即做出响应,而又需要耗费很长时间获得结果。物化视图必须能快速更新,它取决于对更新频率和内容准确性的要求。
物化视图的优点
提高查询性能:物化视图可以避免一些重复的JOIN
操作,从而提高查询性能(连接一次就存下来了)
减少对资源的依赖:物化视图可以将部分数据存储到内存中,避免频繁读取磁盘文件
对复杂查询的支持:物化视图可以处理复杂的查询,如聚合查询、分组查询等(普通视图是不能更新这些的)
物化视图的缺点
一致性问题:物化视图中的数据可能会和原始数据不一致,需要定期的刷新来保证数据的一致性
存储空间问题:物化视图需要占用存储空间,如果数据量过大,可能会占用大量的存储空间
更新效率问题:物化视图的更新需要耗费一定的时间,如果更新频率过高,可能会影响系统的正常运行
物化视图是一个实际存在的表,而不是一个虚拟表。物化视图的数据存储在磁盘上,它可以提高查询性能。