视图
视图是一种虚拟存在的表,并且是动态生成的,只保存了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
test | v1 | v2 |
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
test | v1 | v2 |
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的效果类似,无论是更新还是删除都是作用在原本的基础表格上,再最后改变视图的数据内容。
test | v1 | v2 |
不可更新的视图类型
视图的可更新性和视图中查询的定义有关系,以下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;
- join
- from一个不能更新的视图
- where子句的子查询引用了from子句中的表