1. 概述
在MySQL中,视图(View)是一个虚拟存在的表,其内容是由查询定义的。视图本身并不包含数据,它只包含一条SQL查询语句(即定义视图的SELECT语句)。当通过视图访问数据时,MySQL会执行这条查询语句,并返回查询结果。因此,视图可以看作是一个预定义的SQL查询,它提供了一种灵活的方式来访问和操作数据。
视图具有以下特点:
简化复杂查询:通过创建一个视图,可以将复杂的SQL查询语句简化为一个简单的查询,从而方便用户访问和操作数据。
数据抽象:视图可以隐藏数据的复杂性和底层表的结构,只展示用户需要关注的数据。这样,用户无需了解底层表的具体细节,只需通过视图来访问和操作数据。
安全性:通过视图,可以控制用户对数据的访问权限。可以创建只包含部分字段或部分记录的视图,从而限制用户对数据的访问范围。
逻辑独立性:当底层表的结构发生变化时,只需要修改视图的定义,而无需修改依赖于视图的应用程序代码。这提高了数据库的逻辑独立性。
2. 视图的基本操作
创建
-- 创建视图 -- create view 视图名称 as select (字段名)视图有哪些字段 from (表名)从哪张表提取字段 where 条件(过滤哪些数据进视图)
create view emp_vi_1 as select id, name from emp where age = 18;
查看
查看创建视图的语句信息
show create view 视图名
查看视图内的数据
select 字段名 from 视图名
-- 查看视图
-- 查看视图创建语句
show create view emp_vi_1;
-- 查看视图数据(和表操作一致)
select * from emp_vi_1;
修改
create or replace view 视图名 as select 字段名 from 表名 where 条件;
alter view 视图名 as select 字段名 from 表名 where 条件;
-- 修改视图
-- 方式一:create or replace view 视图名 as select 字段名(该视图有哪些字段)from 表名 where 条件过滤
create or replace view emp_vi_1 as select id, name, age from emp where age <= 20;
-- 方式二:alter view 视图名 as select 字段名(该视图有哪些字段) from 表名 where 条件过滤
alter view emp_vi_1 as select id, name from emp where age <= 20;
删除
drop view if exists 视图名;
-- 删除视图
-- drop view (if exists)括号内容可省略 视图名1,视图名2... ;
drop view if exists emp_vi_1;
3. 检查选项
-- 创建视图时加上关键字with cascaded check option -- with local check option; -- 加上该关键字创建的视图在数据进行插入、更新、删除时会进行数据校验
cascaded
-- cascaded注意:在插入数据到视图时如果该视图加了cascaded关键字则插入的数据需要同时满足当前视图的条件以及该视图所依赖的视图的条件(不论依赖视图是否添加了local、cascaded关键字)
栗子 1
-- 视图的创建可基于表创建也可也基于视图进行创建
create view emp_v_1 as select id, name, age from emp where age >= 10;
-- 基于视图1创建视图2
create view emp_v_2 as select id, name, age from emp_v_1 where age <= 30 with cascaded check option;
-- 如:此时插入两条数据,会对视图2的插入进行校验,符合在对视图1进行校验,两个都符合才会进行数据插入
-- 插入成功
insert into emp_v_2 value (55, '汤姆', 25);
-- 插入失败
insert into emp_v_2 value (56, '杰瑞', 9);
栗子2
-- 基于视图2创建视图3
create view emp_v_3 as select id, name, age from emp_v_2 where age >= 20;
-- 往视图3插入数据,此时视图3没有加关键字cascaded不会对视图3进行数据校验,检查完视图3后会对视图2进行校验,
-- 视图2加了cascaded会进行数据校验,并对所依赖的视图进行校验
-- 此时虽然不满足视图3,但该视图没有关键字,不会进行age >= 20 校验,此时同满足视图2,1,故不会报错,会在满足条件的视图中插入数据
insert into emp_v_3 value (92, '凯迪', 15);
local
-- local注意:再插入数据到视图时如果该视图加了local会对当前视图的条件进行数据校验,如果所依赖的视图没有添加local或者cascaded关键字则不会进行数据校验
local和cascaded区别
-- local和cascaded相同点: -- local、cascaded都会对当前添加了该关键字的视图进行数据校验 -- local和cascaded区别: -- cascaded不论基于的视图是否含有cascaded、local关键字都会对所依赖的视图的条件进行数据校验 -- local所基于的视图如果没有cascaded、local关键字则不会对所依赖的视图的条件进行数据校验
4. 更新
视图是基于表或者视图创建而来,当所依赖的表不存在要更新的内容自然更新失败