视图的概念
- 视图是一种虚拟的表,具有和物理表相同的功能。
- 视图通常是有一个表或者多个表的行或列的子集。
- 可以对视图进行增,改,查,操作
- 对视图的修改不影响基本表
- 相比多表查询,它使得获取数据更容易
视图的优点
- 视图能够简化用户的操作,用户完全不需要关心后面对应的表的结构、关联条件和筛选条件
- 视图使用户能以多种角度看待同一数据
- 视图为数据库提供了一定程度的逻辑独立性
- 视图能够对机密数据提供安全保护,用户只能访问被允许查询的结果集
- 视图的结构确定后,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响
视图的操作
视图的创建
基本格式:
CREATE [OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = { user | CURRENT_USER }]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
释义:
OR REPLACE:表示替换已有视图
ALGORITHM选项:选择在处理定义视图的select语句中使用的方法
- UNDEFINED:MySQL将自动选择所要使用的算法
- MERGE:将视图的语句与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分
- TEMPTABLE:将视图的结果存入临时表,然后使用临时表执行语句
- 缺省ALGORITHM选项等同于ALGORITHM = UNDEFINED
- DEFINER选项:指出谁是视图的创建者或定义者
- definer= '用户名'@'登录主机'
- 如果不指定该选项,则创建视图的用户就是定义者,指定关键字CURRENT_USER(当前用户)和不指定该选项效果相同
- SQL SECURITY选项:要查询一个视图,首先必须要具有对视图的select权限。
- SQL SECURITY DEFINER:定义(创建)视图的用户必须对视图所访问的表具有select权限,也就是说将来其他用户访问表的时候以定义者的身份,此时其他用户并没有访问权限。
- SQL SECURITY INVOKER:访问视图的用户必须对视图所访问的表具有select权限。
- 缺省SQL SECURITY选项等同于SQL SECURITY DEFINER
select_statement:表示select语句
[WITH [CASCADED | LOCAL] CHECK OPTION]:对视图所做的DML操作的结果,不能违反视图的WHERE条件的限制,保证更新视图是在该视图的权限范围之内。
cascade是默认值,表示更新视图的时候,要满足检查所有的视图和表的相关条件
local表示更新视图的时候,只检查将要更新的视图本身,对嵌套视图(定义在另一个视图的上面的视图)不检查其底层的视图
建议:推荐使用 WHIT [CASCADED|LOCAL] CHECK OPTION选项,可以保证数据的安全性
查看视图
- 使用
SHOW CREATE VIEW view_name;
查看视图定义 - 像一个普通表那样使用 SELECT 查询视图内容
- 有关视图的信息记录在information_schema数据库中的views表中
select * from information_schema.views where TABLE_NAME=view_name;
视图的更改
- CREATE OR REPLACE VIEW语句修改视图定义
- ALTER语句修改视图
ALTER
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = { user | CURRENT_USER }]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
- 更新视图中数据 (DML操作)
因为视图本身没有数据,对视图进行的数据操作最终都体现在基表(用来创建视图的表叫做基表)中,但是,并不是所有的视图都可以做DML操作。
下面情形中不能做DML操作:
- select子句中包含distinct
- select子句中包含组函数
- select语句中包含group by子句
- select语句中包含order by子句
- select语句中包含union 、union all等集合运算符
- where子句中包含相关子查询
- from子句中包含多个表
- 如果视图中有计算列,则不能更新
- 如果基表中有某个具有非空约束的列未出现在视图定义中,则不能做insert操作
删除视图
删除视图时,只能删除视图的定义,不会删除数据,也就是说不动基表。
使用drop 删除视图,语法和删除表类型:
DROP VIEW [IF EXISTS]
view_name [, view_name] ...
<END>