十六、视图(view)

十六、视图(view)

1、什么是视图

  1. 定义
    1. 视图是mysql数据库中存放数据的一个接口(也可以说是虚表);是MySql服务器中的一个对象,用于存储査询语句
  2. 目的
    1. 目的是简化查询,控制数据访问,保持数据独立性,避免访问相同的数据,提高查询语句的使用效率,避免在多处地方重复性开发相同的查询语句
  3. 视图作用【面试】
    1. 提高了查询语句复用性,避免了在多处地方重复进行查询语句开发行为
    2. 隐藏业务中涉及的表关系,开发人员通过视图进行操作时是不会知道其具体操作的表

2、命令

  1. 创建视图

    1. -- 格式
      create [or replace] view 视图对象名[columnlist] as 查询语句;
      
      -- 栗子
      CREATE OR REPLACE VIEW view0702 AS
      SELECT * FROM emp WHERE deptno=30;
      
  2. 调用视图

    1. -- 格式
      SELECT * FROM 视图对象名;
      
      -- 栗子
      SELECT * FROM view0702;
      
  3. 查看视图

    1. -- 查看视图定义
      DESCRIBE 视图名称;
      
      -- 这也可以看到视图名
      show tables;
      
      -- 查看视图详细信息
      SHOW CREATE TABLE 视图名称;
      SHOW CREATE VIEW 视图名称;
      
  4. 修改视图

    1. -- 格式
      ALTER VIEW 视图对象名[columnlist] AS 查询语句;
      
    2. 注意:当真实表修改了某个存在视图中的字段时,这个视图也需要跟着变,否则会变成无效视图

  5. 删除视图

    1. -- 格式
      drop view [IF EXISTS] 视图对象名[, 视图对象名2, 视图对象名3...];
      
  6. 额外功能:视图对象存储一个查询语句,同时视图对象拥有对当前查询语句关联的表文件的操作能力

    1. 普通视图操作总结(没错都是本帅试出来的)

      1. 插入视图数据:视图依赖多个基本表时,不能insert数据,且插入的数据必须包含所有不为空的列
      2. 修改视图数据:视图依赖多个基本表时,则一次只能变动一个基本表
      3. 删除视图数据:视图依赖多个基本表时,不能用delete
    2. 通过视图对象对关联表文件数据行进行插入

      1. 当视图只依赖了一个基本表,可插入数据

      2. 如果对多表联查的视图进行插入操作会报如下错误(没错就是本帅报出来的)

        1. Can not insert into join view 'ms_user.sale_goods_view' without fields list
          
    3. 通过视图对象对关联表文件数据行进行删除

      1. -- 删除视图 (会影响原表数据吗?原表数据改变了!)
        DELETE FROM view0702 WHERE empno=7369;
        
    4. 通过视图对象对关联表文件数据行进行更新

      1. -- 修改视图 (会影响原表数据吗?原表数据改变了!)
        UPDATE view0702 SET sal=10 WHERE empno=7369;
        
  7. 创建只读视图※※※注意:MySql不支持!※※※

    1. **还想改吗?哦!你没机会了!**只需要在视图最后加上 with read only 即可(Oracle支持)

    2. -- 格式
      CREATE OR REPLACE VIEW 视图对象名 AS 查询语句 WITH READ ONLY;
      
  8. 复杂视图修改非法

    1. 没错!普通视图可以修改,但复杂视图就不行了,不行就是不行!

    2. -- 栗子
      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
      
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

纯纯的小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值