MySQL视图简介
数据库中的视图是一个虚拟表。同真实的表一样,视图包含一系列有名称的行和列数据。行和列数据来自由定义视图所查询所引用的表,并且在引用视图时动态生成。
对其中所引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。分布式查询也可用于定义使用多个异类源数据的视图。如果有几台不同的服务器分别存储组织中不同地区的数据,而您需要将这些服务器上相似结构的数据组合起来,这种方式就很有用。
视图的定义
视图是一个虚拟表,是从数据库中一个或多个表中导出来的表;视图还可以从已经存在的视图的基础上定义。
视图一经定义便存储在数据库中,与其相对应的数据并没有像表那样在数据库中再存储一份,通过视图看到的数据只是存放在基础表中的数据。对视图的操作与对表的操作一样,可以对其进行插叙、修改和删除;
当对通过视图看到的数据进行修改时,相应的基本表的数据也要发生变化;同时,若基本表的数据发生变化,则这种变化也可以自动地反映到视图中。
为后面示例,先创建两个表:student表和stu_info表;
视图的作用
1.简单。看到的就是需要的,视图不仅可以简化用户对数据的理解,也可以简化他们的操作;将经常用到的查询定义为视图,从而使得用户不必为以后的操作每次指定全部条件。
2.安全。通过视图用户只能查询和修改他们所能见到的数据
3.逻辑数据独立性。视图可以帮助用户屏蔽真实表结构变化带来的影响。
创建视图
基本语法
创建视图基本语法如下:
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
其中CREATE创建新的视图;REPLACE表示替换已经创建的视图;ALGORITHM表示视图选择的算法;view_name为视图的名称,column_list为属性列;select_statement为SELECT语句;[WITH [CASCADED | LOCAL] CHECK OPTION]表示视图在更新是保证在视图的权限范围之内。
可选的ALGORITHM子句是对标准SQL的MySQL扩展。ALGORITHM可取三个值:MERGE、TEMPTABLE或UNDEFINED。
如果没有ALGORITHM子句,默认算法是UNDEFINED(未定义的)。算法会影响MySQL处理视图的方式。
MERGE:会将引用视图的语句的文本与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分。
TEMPTABLE:视图的结果将被置于临时表中,然后使用它执行语句。
UNDEFINED:MySQL自己选择所要使用的算法。如果可能,它倾向于MERGE而不是TEMPTABLE;这是因为MERGE通常更有效,而且如果使用了临时表,视图是不可更新的。
如果没有ALGORITHM子句,默认算法是UNDEFINED(未定义的)。算法会影响MySQL处理视图的方式。
MERGE:会将引用视图的语句的文本与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分。
TEMPTABLE:视图的结果将被置于临时表中,然后使用它执行语句。
UNDEFINED:MySQL自己选择所要使用的算法。如果可能,它倾向于MERGE而不是TEMPTABLE;这是因为MERGE通常更有效,而且如果使用了临时表,视图是不可更新的。
在单表上创建视图
举个栗子~
创建一个表并插入数据:
创建视图:
在多表上创建视图
例如,在student表和stu_info上创建视图,如下所示:
同样,先插入数据:
再创建视图如下:
查看视图
查看视图基本信息
1.使用DESCRIBE语句查看视图基本信息,语法如下:
DESCRIBE(DESC) 视图名;
2.使用SHOW TABLE STATUS语句查看视图基本信息,语法如下:
SHOW TABLE STATUS LIKE '视图名';
这里可以看到视图的‘COMMENT’的值为VIEW说明该表为视图,其他的信息为NULL说明这是一个虚表,如果是基本表那么会基表的信息,这是表和视图的区别!
3.使用SHOW CREATE VIEW语句查看视图详细信息,语法如下:
SHOW CREATE VIEW 视图名;
4.在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_t,新的视图view_t少了一个字段。
2.使用ALTER语句修改视图,基本语法如下:
ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
可以看到,只是将关键命令更换成了ALTER。
更新视图
1.使用UPDATE语句更新视图view_t,语法如下:
UPDATE view_t SET qty=5;
示例如下:
可以看到,对视图view_t更新后,基本表t的内容也更新了;同样我们知道,如对基本表更新后,另外一个视图view_t2中的内容也会更新。
2.使用INSERT更新,示例如下:
3.使用DELETE语句删除视图view_t2中的一条记录,示例如下:
这里注意:
当视图中包含如下内容的时候,视图的更新操作将不能被执行
1.视图中包含基本中被定义为非空的列
2.定义视图的SELECT语句后的字段列表中使用了数学表达式
3.定义视图的SELECT语句后的字段列表中使用聚合函数
4.定义视图的SELECT语句中使用了DISTINCT、UNION、TOP、GROUP BY 、HAVING子句
删除视图
基本语法为:
DROP VIEW IF EXISTS 视图名;