【SQL】视图
2015-10-17 18:32
288 查看
一、虚拟视图
由create table定义的表:以物理形式存在,实际存储在数据库中视图:虚拟的,并不是一个真正存在的表
1.视图定义
CREATE VIEW <视图名> AS <视图定义>
例1.
CREATE VIEW ParamountMovies AS SELECT title, year FROM Movies WHERE studioName = 'Paramount';
例2.涉及多个表
CREATE VIEW MovieProd AS SELECT title, name FROM Movies, MovieExec WHERE producerC# = cert#;
例3.涉及属性重命名
CREATE VIEW MovieProd(movieTitle, prodName) AS SELECT title, name FROM Movies, MovieExec WHERE producerC# = cert#;
2.视图查询
跟查询普通的表一样。
3.视图更新
理论上,视图的更新没有意义,因为它是虚拟的。
但是,特别简单的视图可以更新,其本质是更新了与视图相关的实体表。
3.1视图删除
DROP VIEW ParamountMovies;删除视图不会影响实体表,但是删除了实体表会导致相应的视图不可用。
3.2可更新视图
只有简单的视图才可以更新,说白了,就是视图简单到可以更新视图的数据明确的找到实体表应该调整的地方,让实体表做真正的更新。可更新视图的条件:
1.视图仅从单个关系R中选出
2.用SELECT而非SELECT DISTINCT选出
3.WHERE 子句中不能使用R
4.SELECT中的属性必须足够多,保证对R插入时可以通过默认值的填充剩下的值。
语句跟普通的插入更新语句相同。
3.3更新视图时的不合理现象
对下面的视图:CREATE VIEW ParamountMovies AS SELECT title, year FROM Movies WHERE studioName = 'Paramount';
采用插入操作
INSERT INTO ParamountMovies VALUES('Star Trek',1979);
由于并没有在插入时指明studioName = 'Paramount',导致插入到实体表R中的语句无法在视图中被检索出来。这是显然不合理的。
解决方法:
1.定义视图时就把studioName属性加入
2.采用替换触发器
CREATE TRIGGER ParamountInsert INSTEAD OF INSERT ON ParamountMovies REFERENCING NEW ROW AS NewRow FOR EACH ROW INSERT INTO Movies(title, year, studioName) VALUES(NewRow.title, NewRow.year, 'Paramount');
INSTEAD OF表明替换:即原本的操作不会被执行,而是执行触发器中的动作!
二、物化视图
物化视图:把视图存储在存储空间中,让视图不在是虚拟的。物化视图的维护:
1.定期维护:比如每24小时重新生成一次,在实时性要求不高时可以采用
2.增量维护:当基本表变化时,根据其变化情况对物化视图做少量的修改。不用重新生成整个表。
物化视图的生成、维护也需要代价,但是在多个表连接查询等情况,用物化视图可以减少时间的消耗。
用物化视图代替基本表也有很多的要求,本质是保证查询不会出错。
具体物化视图的知识还需要再学习。
相关文章推荐
- SQL server 聚集索引与主键的区别
- Mysql删除所有表不删除数据库方法
- [Oracle] 接线表
- mysql 编译安装和安装
- 漫谈数据库索引
- win7 64位下如何安装配置mysql
- 分页sql写法【只用最新的】
- 优化SQL查询:如何写出高性能SQL语句
- mysql.sock的作用
- 如何获取MySql的ADO连接字符串
- PHP-Redis扩展使用手册(一)
- MYSQL IF 和 IFNULL 函数 IF(expr1,expr2,expr3) IFNULL(expr1,expr2)
- 修改mysql密码
- SQLServer用sql语句怎么返回一个月所有的天数
- ADO.NET连接SQLServer1
- mysql新建表+插入内容
- Magento联表查询产品的Group Price 以及 历史已完成订单的产品的price 的 SQL 语句
- SQLite数据库
- SQL Server日志
- hibenate 操作oracle 日期问题