MYSQL 视图(增删查改&6种不可更新的视图类型)

您所在的位置:网站首页 数据库视图的种类 MYSQL 视图(增删查改&6种不可更新的视图类型)

MYSQL 视图(增删查改&6种不可更新的视图类型)

2024-05-29 22:02| 来源: 网络整理| 查看: 265

视图

视图是一种虚拟存在的表,并且是动态生成的,只保存了SQL逻辑,不保存查询结果。

虚拟表、和普通表一样使用临时性:临时组建的表格,可以重复利用

应用场景: 1)多个地方用到同样的查询结果;2)该查询结果使用的SQL语句较复杂。

视图和表的区别 语法是否实际占用物理空间使用视图create view基本没有,(只保存SQL逻辑,没有保留数据)增删改查,一般不能增删改表create table占用,保存了实际的数据增删改查 视图创建和使用 #创建视图 create view 视图名 As ; #使用视图 select * from 视图名 #例子:查询姓张的老师名和课程 create view V1 AS Select t_name, c_name from teacher t inner join course c on t.t_id=c.t_id select * from V1 Where t_name like '张%';;

在‘rsViews’标签下,生成了V1的视图。 在这里插入图片描述

视图修改 #视图的修改 #方式一: create or repace view 视图名 as ; #方式二 alter view 视图名 as ; 删除视图 #删除视图 drop view 视图名1,视图名2……; 查看视图 方法一: #方法一 DESC 视图名;

在这里插入图片描述

方法二: #方法二 show create view 视图名;

在这里插入图片描述

更新视图

更新视图里面的数据,视图的更新实际上是对基本表增加或者删除记录,一般情况下都不建议对视图进行操作。

#插入 insert into 视图名 values(...); #修改:将名字BBB改成AAA update 视图名 set last_name='AAA' where last_name='BBB'; #删除 delete from 视图名 where last_name='BBB';

下面通过实例过程说明:

1. 查看基本表格&创建视图 原表格test包含order_id,customer_id 和product_id三列创建视图V1,视图重复引用了order_id,并命名为c1,c2创建视图V2,只包含一列order_id, 命名c1 #创建视图 create view v1 as select order_id as c1, order_id as c2 from test create view v2 as select order_id as c1 from test #查看视图 select * from v1 select * from v2 testv1v2在这里插入图片描述在这里插入图片描述在这里插入图片描述 2. Insert插入语句 #向视图V1插入新数据:报错 insert into v1 values(100,200) #向视图v2插入新数据:成功 insert into v2 values(100); #重新查看原表格:增加新的数据行order_id=100,其他列NULL select * from test #视图V1、V2也同时更新。

结果展示: - V1报错,不可以插入数据 - V2数据插入成功 - 同时,原来的表格test也被修改插入新数据。增加了最后一行order_id=100的新数据行。这时返回去看两个视图内容,也是同步增加了100的数据行。

test视图V1 (引用重复列)报错,表示表格不可以被插入视图V2插入成功在这里插入图片描述在这里插入图片描述在这里插入图片描述 3. Update更新语句

在视图V1中,将c1=1更新为999, 结果原表格以及两个视图都是修改为999

#数据更新 update v1 set c1=999 where c1=1; #结果查看 select * from test select * from v1 select * from v2

结果展示:

虽然修改的是视图V1中的c1, 但是c1和c2都是引用同一列order_id。使用Update更新时,实际上是对原本表格test的order_id列进行更新,因此最后V1的c1、c2列都同步更新为999 testv1v2在这里插入图片描述在这里插入图片描述在这里插入图片描述 4. Delete删除语句

同上,delete也试着删除一行,看看对三个视图表格的影响。

#删除视图中c1=10的数据 delete from v1 where c1=10; #结果查看 select * from test select * from v1 select * from v2

结果展示:

三个表格test、v1、v2中10 已被删除。可见 delete和insert的效果类似,无论是更新还是删除都是作用在原本的基础表格上,再最后改变视图的数据内容。

在这里插入图片描述

testv1v2在这里插入图片描述在这里插入图片描述在这里插入图片描述 不可更新的视图类型

视图的可更新性和视图中查询的定义有关系,以下6种类型的视图不可更新:

包含:分组函数,distinct,group by, having, union, union all常量视图:看下面例子, myv2 不能更新 #常量视图 create or replace view myv2 as select 'john' name; select * from myv2;

在这里插入图片描述

select 中包含子查询 create or replace view myv3 as select (select MAX(salary) from employees) 最高工资; select * from myv3; joinfrom一个不能更新的视图where子句的子查询引用了from子句中的表


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3