mysql入门-视图

本系列内容基本上是从一本叫做《Mysql入门很简单》上面整理的。如果侵犯了你的权益,告诉我,我删掉!

视图

一、视图的基础

视图是从一个或多个表中导出来的虚拟表。

1、视图需要达到的目的就是所见即所需,视图可以简化对数据的操作。
2、通过视图,用户只能查询和修改指定的数据。
3、视图可以屏蔽原有表结构变化带来的影响

二、基础操作

CREATE [ ALGORITHM={ UNDEFINED | MERGE | TEMPTABLE }] --ALGORITHM表示视图选择的算法UNDEFINED自动选择,
VIEW 视图名 [( 属性清单 )] --MERGE表示将视图的语句与视图定义合并起来,使得视图定义的某一部分取代语句对应部分
AS SELECT语句 --TEMPTABLE表示将视图的结果存入临时表,使用临时表执行语句
[ WITH [ CASCADED|LOCAL ] CHECK OPTION ] ; --WITH CHECK OPTION 更新视图时要保证在该视图的权限范围之内
--CASCADED表示更新视图时要满足所有相关视图和表的条件,该参数为默认值
--LOCAL表示更新视图时,要满足该视图本身的定义的条件即可。

使用CREATE VIEW语句创建视图时,最好加上WITH CHECK OPTION 和 CASCADED参数参数。
这样,从视图上派生出来的新视图后,更新新视图需要考虑其父视图的约束条件。这种方式比较严格,可以保证数据的安全性。

----------------------------
CREATE VIEW department_view1 AS SELECT * FROM department; --在单个表上建立视图
CREATE VIEW department_view2 ( name, fuction, location)
AS SELECTd name, function, address FROM department; --在单个表上建立视图

CREATE ALGORITHM=MERGE VIEW
worker_view1 (name, department, sex, age, address )
AS SELECT name, department.d_name, sex, 2009-birthday, address
FROM worker,department
WHERE worker.d_id=department.d_id --在多个表上建立视图
WITH LOCAL CHECK OPTION;

三、查看视图
DESCRIBE 视图名
DESC 视图名
SHOW TABLE STATUS LIKE 视图名\G;
SHOW CREATE VIEW 视图名; --查看视图详细信息
SELECT * FROM information_schema.views; --在view中查看视图详细信息

四、CREATE OR REPLACE修改视图
CREATE OR REPLACE [ ALGORITHM = { UNDEFINED|MERGE|TEMPTABLE }]
VIEW 视图名 [( 属性清单 )]
AS相SELECT语句
[ WITH [ CASCADED|LOCAL ] CHECK OPTION ];
-------------------------------
CREATE OR REPLACE ALGORITHM=TEMPTABLE
VIEW department_view1 (department, function, location)
AS SELECT d_name, function, address FROM department ;

五、ALTER语句修改视图
ALTER [ALGORITHM={ UNDEFINED|MERGE|TEMPTABLE} ]
VIEW 视图名 [( 属性清单 )]
AS SELECT语句
[WITH [ CASCADED|LOCAL] CHECK OPTION ];
-------------------------------
ALTER VIEW department view2 ( department, name, sex, location )
AS SELECT d_name, worker.name, worker.sex, address
FROM department, worker
WHERE department.d id=worker.d id
WITH CHECK OPTION;

六、更新视图
因为视图是一个虚拟表,其中没有数据。通过视图更新时,都是转换到基本表来更新。
更新视图时,只能更新权限范围内的数据。

6.1 先创建一个视图
CREATE VIEW department view3( name, function, address)
AS SELECT d_name, function, address FROM department WHERE d_id=1001;
6.2 使用update更新视图
UPDATE department view3 SET name=科研部',function='新产品研发",address='3号楼5层;
6.3 表department中d_id为1001的记录已经更新。
虽然,UPDATE语句更新的是视图department_view3。但实际上更新的是department表。
上面的UPDATE语句可以等价为:
UPDATE department SET d_name='科研部',function='新产品研发',address='3号楼5层' WHERE d_id=1001;
七、视图高级查询
7.1 视图中包含SUM()、COUNT()、MAX()、MIN()等关键字
CREATE VIEW worker_ view4( name, sex, total)
AS SELECTE name, sex, COUNT(name) FROM worker ;
7.2 视图中包含UNION、UNION ALL、DISTINCT、GROUP BY和HAVIG等关键字。
CREATE VIEW worker view5( name, sex, address)
AS SELECT name, sex, homeaddress FROM worker GROUP BY d_id;
7.3 常量视图
CREATE VIEW worker_view6 AS SELECT 'Aric' as name;
7.4 视图中的SELECT语句包含子查询
CREATE VIEW worker view7 (name)
AS SELECT (SELECT name FROM worker);
7.5 由不可更新的视图导出的视图,也是不可更新的视图,执行update时会报错
CREATE VIEW worker_view8
AS SELECT * FROM worker_view7;
7.6 创建视图时,ALGORITHM为TEMPTABLE类型。
CREATE ALGORITHM=TEMPTABLE --ALGORITHM=TEMPTABLE<临时表类型>表示view9是不可更新视图
VIEW worker view9
AS SELECT * FROM worker;
7.7 视图对应的表上存在没有默认值的列,而且该列没有包含在视图里。
例如,表中包含的name字段没有默认值,但是视图中不包括该字段。那么这个视图是不能更新的。
因为,在更新视图时,这个没有默认值的记录将没有值插入,也没有NULL值插入。
数据库系统是不会允许这样的情况出现的,其会阻止这个视图更新。

八、删除视图
DROP VIEW [IF EXISTS] 视图名列表 [ RESTRICT|CASCADE ];
--------------
DROP VIEW IF EXISTS department_view1, department view2;

 

posted @ 2020-08-17 16:34  smallfishy  阅读(178)  评论(0编辑  收藏  举报