十六、视图(view)
1、什么是视图
- 定义
- 视图是mysql数据库中存放数据的一个接口(也可以说是虚表);是MySql服务器中的一个对象,用于存储査询语句
- 目的
- 目的是简化查询,控制数据访问,保持数据独立性,避免访问相同的数据,提高查询语句的使用效率,避免在多处地方重复性开发相同的查询语句
- 视图作用【面试】
- 提高了查询语句复用性,避免了在多处地方重复进行查询语句开发行为
- 隐藏业务中涉及的表关系,开发人员通过视图进行操作时是不会知道其具体操作的表
2、命令
-
创建视图
-
-- 格式 create [or replace] view 视图对象名[columnlist] as 查询语句; -- 栗子 CREATE OR REPLACE VIEW view0702 AS SELECT * FROM emp WHERE deptno=30;
-
-
调用视图
-
-- 格式 SELECT * FROM 视图对象名; -- 栗子 SELECT * FROM view0702;
-
-
查看视图
-
-- 查看视图定义 DESCRIBE 视图名称; -- 这也可以看到视图名 show tables; -- 查看视图详细信息 SHOW CREATE TABLE 视图名称; SHOW CREATE VIEW 视图名称;
-
-
修改视图
-
-- 格式 ALTER VIEW 视图对象名[columnlist] AS 查询语句;
-
注意:当真实表修改了某个存在视图中的字段时,这个视图也需要跟着变,否则会变成无效视图
-
-
删除视图
-
-- 格式 drop view [IF EXISTS] 视图对象名[, 视图对象名2, 视图对象名3...];
-
-
额外功能:视图对象存储一个查询语句,同时视图对象拥有对当前查询语句关联的表文件的操作能力
-
普通视图操作总结(没错都是本帅试出来的)
- 插入视图数据:视图依赖多个基本表时,不能insert数据,且插入的数据必须包含所有不为空的列
- 修改视图数据:视图依赖多个基本表时,则一次只能变动一个基本表
- 删除视图数据:视图依赖多个基本表时,不能用delete
-
通过视图对象对关联表文件数据行进行插入
-
当视图只依赖了一个基本表,可插入数据
-
如果对多表联查的视图进行插入操作会报如下错误(没错就是本帅报出来的)
-
Can not insert into join view 'ms_user.sale_goods_view' without fields list
-
-
-
通过视图对象对关联表文件数据行进行删除
-
-- 删除视图 (会影响原表数据吗?原表数据改变了!) DELETE FROM view0702 WHERE empno=7369;
-
-
通过视图对象对关联表文件数据行进行更新
-
-- 修改视图 (会影响原表数据吗?原表数据改变了!) UPDATE view0702 SET sal=10 WHERE empno=7369;
-
-
-
创建只读视图※※※注意:MySql不支持!※※※-
**还想改吗?哦!你没机会了!**只需要在视图最后加上 with read only 即可(Oracle支持)
-
-- 格式 CREATE OR REPLACE VIEW 视图对象名 AS 查询语句 WITH READ ONLY;
-
-
复杂视图修改非法
-
没错!普通视图可以修改,但复杂视图就不行了,不行就是不行!
-
-- 栗子 CREATE OR REPLACE VIEW sale_goods_view AS SELECT g.goods_id, g.goods_name, g.goods_price, g.goods_amount, count(s.sale_num) sallAmount -- 复杂一丢丢 FROM sale s LEFT JOIN goods g ON s.goods_id = g.goods_id ORDER BY g.goods_id; -- 我更新一波 update sale_goods_view SET goods_name='宇宙牌台式电脑' WHERE goods_id = 'p_yz_00002'; -- 直接报错怼脸 -- [Err] 1288 - The target table sale_goods_view of the UPDATE is not updatable
-