十、MySQL视图
数据库中的视图是一个虚拟表。同真实的表一样,视图包含一系列带有名称的行和列数据。行和列数据来自由定义视图查询锁引用的表,并且在引用视图时动态生成。
一、视图概述
视图是从一个或者多个表中导出的,视图的行为与表非常相似,但视图是一个虚拟表。在视图中用户可以使用SELECT语句查询数据,以及使用INSERT、UPDATE和DELETE修改记录。从MySQL 5.0开始可以使用视图,视图可以使用户操作方便,而且可以保障数据库系统的安全。
1.1 视图的含义
视图是一个虚拟表,是从数据库中一个或多个表中导出来的表。视图还可以从已经存在的视图的基础上定义。
视图一经定义便存储在数据库中,与其相对应的数据并没有像表一样在数据库中再存储一份,通过视图看到的数据只是存放在基本表中的数据。对视图的操作与对表的操作一样,可以对其进行查询、修改和删除。当对通过视图看到的数据进行修改时,相应的基本表的数据也要发生变化;同时,若基本表的数据发生变化,则这种变化也可以自动的反映到视图中。
通过DESC命令可以查看表的设计,可以获得字段、字段的定义、是否为主键、是否为空、默认值和扩展信息。
视图提供了一个很好的解决办法,创建视图的信息来自表的部分信息,只取需要的信息。这样既能满足要求也不破坏表原来的结构。
1.2 视图的作用
与直接从数据表中读取相比,视图有一下优点:
1.2.1 简单化
看到的就是需要的。视图不仅可以简化用户对数据的理解,也可以简化它们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件。
1.2.2 安全性
通过视图用户只能查询和修改他们所能见到的数据。数据库中的其他数据则既看不见也取不到。数据库授权命令可以使每个用户对数据库的检索限制到特定的数据库对象上,但不能授权到数据库特定行和特定的列上。通过视图用户可以被限制在数据的不同子集上:
(1)使用权限可被限制在基表的行的子集上。
(2)使用权限可被限制在基表的列的子集上。
(3)使用权限可被限制在基表的行和列的子集上。
(4)使用权限可被限制在多个基表的连接所限定的行上。
(5)使用权限可被限制在基表中的数据的统计汇总上。
(6)使用权限可被限制在另一个视图的一个子集上,或是一些视图和基表合并后的子集上。
1.2.3 逻辑数据独立性
视图可帮助用户屏蔽真实表结构变化带来的影响。
二、创建视图
视图中包含了SELECT查询的结果,因此视图的创建基于SELECT语句和已存在的数据表,视图可以建立在一张表上,也可以建立在多张表上。
2.1 创建视图的语法形式
创建视图使用CREATE VIEW语句,基本语法格式如下:
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的取值有3个:分别是UNDEFINED|MERGE|TEMPTABLE,UNDEFINED表示MySQL将自动选择算法;MERGE表示将使用视图语句与视图定义合并起来,使得视图定义的某一部分取代语句对应的部分;TEMPTABLE表示将视图的结果存入临时表,然后用临时表来执行语句。
CASCADED与LOCAL为可选参数,CASCADED为默认值,表示更新视图时要满足所有相关视图和表的条件;LOCAL表示更新视图时满足该视图本身定义的条件即可。
该语句要求具有针对视图的CREATE VIEW权限,以及针对由SELECT语句选择的每一列上的某些权限。对于在SELECT语句中其他地方使用的列,必须具有SELECT权限。如果还有OR REPLACE子句,必须在视图上具有DROP权限。
视图属于数据库。在默认情况下,将在当前数据库创建新视图。要想在给定数据库中明确创建视图,创建时应将名称指定为db_name.view_name。
2.2 在单表上创建视图
MySQL可以在单个数据表上创建视图。
创建视图的语句为:
CREATE VIEW view_t AS SELECT column_list FROM tb_name
默认情况下创建的视图和基本表的字段是一样的,也可以通过指定视图字段的名称来创建视图:
CREATE VIEW view_t(column_list) AS SELECT column_list FROM tb_name
2.3 在多表上创建视图
MySQL上也可以在两个或两个以上的表上创建视图,可以使用CREATE VIEW语句实现。
CREATE VIEW view_t[(column_list)] AS SELECT tb1.column_list,tb2.column_list,... FROM tb1,tb2,... WHERE expr
三、查看视图
查看视图是查看数据库中已存在的视图的定义。查看视图必须要有SHOW VIEW的权限,MySQL数据库下的user表中保存着这个信息。查看视图的方法包括:DESCRIBE、SHOW TABLE STATUS和SHOW CREATE VIEW。
3.1 使用DESCRIBE语句查看视图信息
DESCRIBE可以用来查看视图,具体的语法如下:
DESCRIBE 视图名;
运行结果显示出视图的字段定义、字段的数据类型、是否为空、是否为主/外键、默认值和额外信息。
DESCRIBE一般情况下都简写成DESC,输入这个命令的执行结果和输入DESCRIBE的执行结果是一样的。
3.2 使用SHOW TABLE STATUS语句查看视图基本信息
查看视图可以使用SHOW TABLE STATUS的方法,具体的语法如下:
SHOW TABLE STATUS LIKE '视图名';
查询的结果显示出视图的存储引擎,创建时间等。
3.3 使用SHOW CREATE VIEW语句查看视图详细信息
使用SHOW CREATE VIEW语句可以查看视图详细定义,语法如下:
SHOW CREATE VIEW 视图名;
执行结果显示视图的名称、创建视图的语句等信息。
3.4 在views表中查看视图详细信息
在MySQL中,information_schema数据库下的views表中存储了所有视图的定义,通过对views表的查询,可以查看数据库中所有视图的详细信息,查询语句如下:
SELECT * FROM information_schema.views;
查询的结果显示当前以及定义的所有视图的信息。
四、修改视图
修改视图是指修改数据库中存在的视图,当基本表的某些字段发生变化的时候,可以通过修改视图来保持与基本表的一致性。MySQL中通过CREATE OR REPLACE VIEW语句和ALTER语句来修改视图。
4.1 使用CREATE OR REPLACE VIEW语句修改视图
MySQL中如果要修改视图,使用CREATE OR REPLACE VIEW语句,语法如下:
CREATE [OR REPLACE] [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}] VIEW view_name [(column_list)] AS SELECT_statement [WITH [CASCDAED|LOCAL] CHECK OPTION]
可以看到,修改视图的语句和创建视图的语句是完全一样的。当视图一经存在时,修改语句对视图进行修改;当视图不存在时,创建视图。
4.2 使用ALTER语句修改视图
ALTER语句是MySQL提供的另外一种修改视图的方法,语法如下:
CREATE [OR REPLACE] [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}] VIEW view_name [(column_list)] AS SELECT_statement [WITH [CASCDAED|LOCAL] CHECK OPTION]
这个语法的关键字和前面视图的关键字是一样的。
五、更新视图
更新视图是指通过视图来插入、修改、删除表中的数据,因为视图是一个虚拟表,其中没有数据。通过视图更新的时候都是转到基本表上进行更新的,如果对视图增加或者删除记录,实际上是对其基本表增加或者删除记录。
UPDATE view_t SET column=value; INSERT INTO view_t VALUES(value1,value2,...); DELETE FROM view_t WHERE column=value;
视图与基本表的UPDATE、INSERT、DELETE语法一致。
当视图中包含有如下内容时,视图的更新操作将不能被执行:
(1)视图中不包含基本表中被定义为非空的列。
(2)在定义视图的SELECT语句后的字段列表中使用了数学表达式。
(3)在定义视图的SELECT语句后的字段列表中使用聚合函数。
(4)在定义视图的SELECT语句中使用了DISTINCT,UNION,TOP,GROUP BY或HAVING子句。
六、删除视图
当视图不再需要时,可以将其删除,删除一个或多个视图可以使用DROP VIEW语句。
DROP VIEW [IF EXISTS] view_name [,view_name]... [RESTRICT|CASCADE]
其中,view_name是要删除的视图名称,可以添加多个需要删除的视图名称,各个名称之间使用逗号分隔开。删除视图必须拥有DROP权限。