视图

视图是一种虚拟存在的表,并且是动态生成的,只保存了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的视图。

mysql视图不能写注释 mysql视图可以修改吗_数据

视图修改

#视图的修改
#方式一: 
create or repace view 视图名
as 
<查询语句>;

#方式二
alter view 视图名
as 
<查询语句>;

删除视图

#删除视图
drop view 视图名1,视图名2……;

查看视图

  • 方法一:
#方法一
DESC 视图名;

mysql视图不能写注释 mysql视图可以修改吗_mysql_02

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

mysql视图不能写注释 mysql视图可以修改吗_sql_03

更新视图

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

#插入
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

mysql视图不能写注释 mysql视图可以修改吗_sql_04

mysql视图不能写注释 mysql视图可以修改吗_mysql视图不能写注释_05

mysql视图不能写注释 mysql视图可以修改吗_mysql视图不能写注释_06

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插入成功

mysql视图不能写注释 mysql视图可以修改吗_数据库_07

mysql视图不能写注释 mysql视图可以修改吗_mysql视图不能写注释_08

mysql视图不能写注释 mysql视图可以修改吗_mysql视图不能写注释_09

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

mysql视图不能写注释 mysql视图可以修改吗_mysql视图不能写注释_10

mysql视图不能写注释 mysql视图可以修改吗_数据_11

mysql视图不能写注释 mysql视图可以修改吗_sql_12

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的效果类似,无论是更新还是删除都是作用在原本的基础表格上,再最后改变视图的数据内容。

mysql视图不能写注释 mysql视图可以修改吗_数据_13

test

v1

v2

mysql视图不能写注释 mysql视图可以修改吗_数据_14

mysql视图不能写注释 mysql视图可以修改吗_数据_15

mysql视图不能写注释 mysql视图可以修改吗_sql_16


不可更新的视图类型

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

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

select * from  myv2;

mysql视图不能写注释 mysql视图可以修改吗_数据_17

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