视图是存储在数据库中的虚拟表,视图中不保存数据,内部封装了一条SELECT语句,数据来源于查询的一个或多个基本表。视图的结构和基本表相同,也是由行和列构成的二维表,也可以进行增删改查的操作。视图中的数据依赖于基本表中的数据,表中数据发生改变,显示在视图中的数据也会改变,同样,在视图中对数据执行增删改的操作,基本表中的数据也会同步更新。
视图的作用
为了减少代码的重写,或增加代码的重复利用。所以如果语句只需要用一次或一两句,就没有必要单独写视图。
视图的优缺点
优点
- 简单:简化SQL语句,快速提取数据。视图可以将复杂的查询语句进行封装,用户使用时不需要关心表的结构、连接关系、筛选条件、分组和排序等等,只需要对视图进行简单的查询。
- 安全:保护数据,根据特定授权分配权限。创建视图时,可以筛选掉一些不希望用户看到的行和列,也可以给视图设置访问权限,让不同级别的用户看到不同的视图,从而提高数据库的数据安全性。
缺点
- 操作视图会比直接操作基础表要慢,所以我们尽量避免在大型表上创建视图。
- 尽量不要创建嵌套视图,就是在视图中使用视图。 这样在查询时,会多次重复访问基础表,带来性能损耗。
- 在视图中只返回所需的信息,尽量不要在视图使用不需要访问的表。
- 在大型表或者复杂定义的视图,可以使用存储过程代替。
- 频繁使用的视图,可以使用索引视图来代替。
创建视图
语法:
create view <视图名> as <select 查询语句>;
示例:不同职位的最低工资及从事该工作的员工姓名、职位和工资
mysql> create view job_minsal_view as
-> (select ename,t.job,最低工资
-> from (select job,min(sal) 最低工资 from emp group by job) t
-> left join emp on t.job=emp.job
-> where sal=最低工资);
查看视图
语法:
desc <视图名>;
示例:查看视图结构
mysql> desc job_minsal_view;
+--------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| ename | varchar(15) | YES | | NULL | |
| job | varchar(10) | NO | | NULL | |
| 最低工资 | float | YES | | NULL | |
+--------------+-------------+------+-----+---------+-------+
使用视图
语法:
select <字段名1>[,<字段名2>...<字段名n>] from <视图名>[ where <筛选条件>];
示例:查询视图中的记录
mysql> select * from job_minsal_view;
+--------+------------+--------------+
| ename | job | 最低工资 |
+--------+------------+--------------+
| smith | clerk | 800 |
| ward | salesman | 1250 |
| martin | salesman | 1250 |
| clark | manager | 2450 |
| scott | analyst | 3000 |
| king | persident | 5000 |
| ford | analyst | 3000 |
+--------+------------+--------------+
修改视图
修改视图是指修改数据库中已存在的表的定义,当基表的某些字段发生改变时,可以通过修改视图来保持视图和基本表之间一致。
语法:
create [or replace or alter] view <视图名> as <select 查询语句>;
示例:
alter view job_minsal_view as
select empno,ename,t.job,最低工资
from (select job,min(sal) 最低工资 from emp group by job) t
left join emp on t.job=emp.job
where sal=最低工资;
更新视图
因为视图本身没有数据,因此对视图中的数据进行的操作最终都体现在基本表中。
更新视图的三种语法:update、insert和delete
语法:
update <视图名> set <字段>=<值>[ where <条件>];
insert into <视图名> values(值1,值2...值n);
delete from <视图名>[ where <条件>];
当然,不是所有的视图都可以更新,有下列内容之一,视图不能做更新:
- select子句中包含distinct ;
- select子句中包含组函数 ;
- select语句中包含group by子句 ;
- select语句中包含order by子句 ;
- select语句中包含union 、union all等集合运算符 ;
- where子句中包含相关子查询 ;
- from子句中包含多个表 ;
- 如果视图中有计算列,则不能更新;
- 如果基表中有某个具有非空约束的列未出现在视图定义中,则不能做insert操作
删除视图
删除视图是指删除数据库中已存在的视图,删除视图时,只能删除视图的定义,不会删除数据,也就是说基本表中的数据不会被删除。
语法:
drop view[ if exists] <视图名>;
示例:
mysql> drop view job_minsal_view;