一.什么是视图
视图是从一个或多个表中导出来的表,是一种虚拟存在的表。除非是视图索引,否则视图的数据不会存储在数据库中。
二.视图的作用
1.使操作简单化,可以对经常使用的查询定义一个视图,使用户不必为同样的查询操作指定条件
2.增加数据的安全性,通过视图,用户只能查询和修改指定的数据。
3.提高表的逻辑独立性,视图可以屏蔽原有表结构变化带来的影响。
三.创建视图
CREATE [ALGORITHM]={UNDEFINED|MERGE|TEMPTABLE}]
VIEW 视图名 [(属性清单)]
AS SELECT 语句
[WITH [CASCADED|LOCAL] CHECK OPTION];
ALGORITHM表示视图选择的算法(可选参数)
UNDEFINED:MySQL将自动选择所要使用的算法
MERGE:将视图的语句与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分
TEMPTABLE:将视图的结果存入临时表,然后使用临时表执行语句
看几个demo
create table work(
id int,
na varchar(32),
sex varchar(32),
age int,
address varchar(32),
tel int
);
insert into work values(1,'张三','男',18,'北京',12313213),(2,'李四','女',23,'上海',123231),(3,'王五','男',24,'西安',10022233),(4,'赵六','女',25,'天津',111111)
insert into work values(5,'哈哈','男',25,'武汉',12313)
create table salary(
id int,
salary double
);
insert into salary values(1,1232),(2,1313),(3,24131),(4,76465);
create view work_view(ID,NAMES,ADDRESS) as select id,na,address from work;
create view work_view2(id,names,salary) as select work.id,na,salary from work,salary where work.id=salary.id
select * from work_view2
answer is :
1 张三 1232
2 李四 1313
3 王五 24131
4 赵六 76465
也可以看看视图的基本信息:
desc work_view2
id int(11) YES
names varchar(32) YES
salary double YES
创建索引视图:(经常用于很少更新基础数据,否则性能不一定会更好)
可以为视图创建一个唯一的聚集索引,这样视图称为索引视图。
索引视图可以提高下列查询类型的性能:
1.处理大量行的连接和聚合。
2.决策支持。
四.修改视图
当基本表的某些数据的格式改变后,可以修改视图来保持视图和基本表之间的一致。
修改方式1.CREATE OR REPLACE
mysql> CREATE OR REPLACE ALGORITHM=TEMPTABLE
-> VIEW work_view(ID,NAME)
-> AS SELECT id,name FROM work;
Query OK, 0 rows affected (0.03 sec)
当视图不存在时,可以创建视图,存在时,修改视图。
修改方式2.ALTER语句修改
mysql> ALTER VIEW work_view2(NAME,SALARY,ADDR)
-> AS SELECT name,salary,address FROM work,salary
-> WHERE work.id=salary.id;
Query OK, 0 rows affected (0.03 sec)
五.视图数据的修改
可以通过视图修改基本表的数据。其方式与修改表中的数据一样。但是存在诸多限制:
1.不能修改使用了聚合函数(sum,ave,count)的计算列
2.不能修改使用了集合运算符(union,union all,cross join)形成的列得出的结果
3.如果视图中使用了连接查询,则update、insert 只能影响连接的一端<此处我的理解,每次修改只能修改一张表内的内容。不能同时修改两张表的内容。
>。并且不能从视图中删除数据。
六。删除视图
语法:
mysql> DROP VIEW IF EXISTS work_view;
Query OK, 0 rows affected (0.00 sec)
mysql> DROP VIEW work_view2;
Query OK, 0 rows affected (0.01 sec)