视图
-
视图:一种虚拟存在的表,行和列的数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的,只保存SQL逻辑,不保存查询结果
-
应用场景:多个地方用到同样的查询结果,并且该查询结果使用的SQL语句较复杂
-
下面例子中使用的数据表
-
employees 员工表
-
departments 部门表
-
jobs 工种表
-
locations 地点表
员工表分别通过部门id、工种id与部门表、工种表关联,部门表通过地点id与地点表关联。
-
1. 视图的创建
-
语法
create view 视图名 as 查询语句;
-
示例
#创建 create view ema as select last_name,department_name,j.* from employees e join departments d on e.department_id=d.department_id join jobs j on e.job_id=j.job_id #使用 select * from ema where last_name like '%a%';
-
优点
- 重用SQL语句
- 简化复杂的SQL操作,不必知道其内在的查询细节
- 保护数据,提高安全性
2. 视图的修改
-
方式一
create or replace view 视图名 as 查询语句;
-
方式二
alter view 视图名 as 查询语句;
3. 视图的查看与删除
-
查看视图
desc 视图名; #或者 show create view 视图名;
-
删除视图
drop view 视图名,视图名,...;
4. 视图的更新
-
首先创建一个视图
create or replace view myv1 as select last_name,email from employees;
-
对视图执行插入数据
insert into myv1 values('zhangsan','[email protected]');
对视图插入数据后,原始表employees中也插入了相应的行,没有插入值的字段为null。
-
修改视图中数据
update myv1 set last_name='lisi' where last_name='zhangsan';
修改视图中数据后,原始表employees中对应的数据也被修改了。
-
删除视图中数据
delete from myv1 where last_name='lisi';
删除视图中数据后,原始表employees中对应的数据也被删除。
-
视图的可更新性和视图中查询的定义有关系,以下类型的视图不能更新:
- 包含以下关键字的SQL语句:分组函数、distinct、group by、having、union、union all
- 常量视图
- select中包含子查询
- join
- from一个不能更新的视图
- where子句的子查询引用了from子句中的表
-
视图一般是用来查询的,不会对其进行更新。