一、视图的理解
1、视图是一张虚拟表,它依赖数据库中的表存在,并且在引用视图时动态生成,是从一个或多个表中导出来的表,视图的行为和表相似。
2、当对通过视图看到的数据进行修改时,相应的基本表的数据也会发生变化,若基本表发生变化视图也会发生变化。
3、创建视图的信息来自表的部分信息,能够查询表中的信息也无需破坏原来表的结构。
4、作用:
简单化(视图可以简化用户对数据的影响,简化他们的操作)
安全性(通过视图用户可以被限制在数据的不同子集上,权限)
逻辑独立性(视图可以屏蔽表结构变化带来的影响)
一、创建视图(建立在一张/多张表上)
Create [or replace] [algorithm=[undefined|merge|temptable]
View view_name [column_list]
As select_statement
[with [cascaded|local] check option]
解释:algorithm是视图选择的算法:undefined表示mysql自动选择算法,merge表示将使用的视图语句与视图定义合并起来,temptable表示将视图结果存入临时表,然后用临时表来执行语句。
Cascaded|local为可选参数,cascaded为默认值,表示更新视图要满足所有相关视图和表的条件,local表示更新视图只需满足视图本身定义的条件即可。
Create/replace view都需要满足相应的权限才行。
1、在单表上创建视图
Create table t(quantity int,price int);
Insert into t values(3,50);
Create view view_t as select quantity,price,quantity*price from t;
Create view view_t2(qyt,price,total) as select quantity,price,quantity*price from t;
2、在多表上创建视图
二、查看视图
1、使用describe语句查看视图基本信息
Describe viewname;
2、使用show table status查看视图基本信息
Show table status like’viewname’;
3、使用show crate view语句查看视图详细信息
Show create view viename;
4、在views表中查看详细信息
在MySQL中,information_schema数据库表下的views表中存储了所有视图的定义,对views表的查询,可以查看数据库中所有视图的详细信息
Select * from information_schema.views;
三、修改视图
修改视图是修改数据库表中存在的视图,当基本表的某些字段发生变化时,可以通过修改视图来保持与基本表的一致性。
1、使用create or replace view语句修改视图
Create [or replace] [algorithm=[undefined|merge|temptable]
View view_name [column_list]
As select_statement
[with [cascaded|local] check option]
实例:create or replace view view_t as select * from t;
2、使用alter语句修改视图
Alter [algorithm=[undefined|merge|temptable]
View view_name [column_list]
As select_statement
[with [cascaded|local] check option]
实例:alter view view_t as select quantity from t;
四、更新视图
更新视图是通过视图来插入、更新、删除表中的数据,因为视图是一个虚拟表,其中没有数据。通过视图更新的时候都是通过表进行更新的。有三种视图更新方法:insert/update/delete
实例:
Update view_t set quantity=5;
Insert into t values(3,5);
Delete from view_t where price=5;
视图中包含如下内容是,更新操作不能执行:
1)视图中不包含基表中被定义非空的列
2)在定义视图的select语句后的字段列表中使用了数学表达式/聚合函数
3)在定义视图的select语句中使用了distince,union,top,groupby/having
五、删除视图
Drop view [if exists]
View_name[,view_name]……
[restrict|cascade]
实例:drop view if exists view_t;