为什么使用视图?
既然视图存在那就有它存在的必要。换言之,它有优点。
优点:
- 重用SQL语句
- 简化复杂的SQL操作。编写查询后,可以方便地重用它而不必知道它而不必知道它的基本查询细节。
- 使用表地组成部分而不是整个表
- 保护数据。可以给用户授予表的特定部分的访问权限而不是整个表的访问权限
- 更改数据格式和表示。视图可返还与底层表的表示和格式不同的数据
有优点就有缺点
缺点:
- 视图不能索引,触发器,默认值或者规则。数据多时会造成影响。
- 如果用多个连接和过滤条件创建了视图或者嵌套了视图,可能会十分影响性能。
一、视图是什么?
视图是一个虚拟存在的表,和真实表一样是由行和列构成,视图的数据却不存在于数据库中,存在视图中的只是视图的定义。视图中的数据完全来自于表中,是在使用视图时获取的。视图和表的本质在于视图是基于真实表的一张虚拟的表,它的数据来源于真是表的基础上。
打个比方:真实表与视图,就如同一个物体照镜子,真实表就是就是那个物体,视图就是物体映在镜子里的图像。两者虽说在看着一样,但是镜子的图像是虚拟的,当物体改变时,镜子里映射的影像也会改变。
二、创建视图
语法 create view 视图名 as select语句
视图名:视图名必须是唯一命名,新创建的视图名不能和其他的视图名和其他的表名相同
select语句:指的是创建视图的select语句
例如:创建一个视图
select c.last_name, c.first_name, b.dept_name, c.birth_date
from dept_emp a,
departments b,
employees c
where a.dept_no = b.dept_no
and a.emp_no = c.emp_no;
如果我们要查看查看视图字段情况的的话,可以 采用 describe 视图名
describe v_user;
如果要查看创建视图的SQL,可以 show create view 视图名
show create view v_user;
二、修改视图
一般将视图用于查询而不是更新用的。要更新的话
采用 alter view 视图名 as select语句 也可以先删除再创建
并不是所有的视图都可以更新的,视图定义中存在以下情况,则是不允许更新的
- 分组 使用order by 或者 having
- 聚集函数
- union或者union all的并操作
- 子查询
- distinct关键字
比如,在原视图里减少一个生日字段
alter view v_user as select c.last_name, c.first_name, b.dept_name
from dept_emp a,
departments b,
employees c
where a.dept_no = b.dept_no
and a.emp_no = c.emp_no;
三、删除视图
那就是 drop view 视图名
drop view v_user;
四、查询视图
如果我们要使用视图查询
select * from v_user;
它等价于
select c.last_name, c.first_name, b.dept_name
from dept_emp a,
departments b,
employees c
where a.dept_no = b.dept_no
and a.emp_no = c.emp_no;
这样看来视图的确是简化了sql 。