MySQL的视图讲解
1、什么是视图
视图是从一个或多个表中查询出来的数据保存为视图,是一种虚拟存在的表。
注意:
数据库中只存放了视图的定义,而没有存放视图中的数据,这些数据存放在原来的表中。
使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。
视图中的数据依赖于原来表中的数据,一旦表中数据发生改变,显示在视图中的数据也会发生改变。
2、为什么要使用视图
重复利用SQL语句
简化SQL查询,快速取数据
只用知道表的部分结构
保护数据,根据特定授权(分配用户一定权限,安全性)
更改数据格式,视图可返回与底层表的格式不同的数据表,展现出来。
3、视图与表的区别:
- 表要占用磁盘空间,视图不需要
- 视图不能添加索引
- 使用视图可以简化查询
- 视图可以提高安全性
4 .创建视图
CREATE VIEW语法
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
解释::
- OR REPLACE : 替换重复视图名(可选)
- ALGORITHM :可选的ALGORITHM子句是对标准SQL的MySQL扩展
可取三个值: MERGE 、 TEMPTABLE 或 UNDEFINED 。如果没有ALGORITHM子句,默认算法是 UNDEFINED (未定义的)。算法会影响MySQL处理视图的方式。
对于MERGE,会将引用视图的语句的文本与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分。
对于TEMPTABLE,视图的结果将被置于临时表中,然后使用它执行语句。
对于UNDEFINED,MySQL将选择所要使用的算法。如果可能,它倾向于MERGE而不是TEMPTABLE,这是因为MERGE通常更有效,而且如果使用了临时表,视图是不可更新的。
明确选择TEMPTABLE的1个原因在于,创建临时表之后、并在完成语句处理之前,能够释放基表上的锁定。与MERGE算法相比,锁定释放的速度更快,这样,使用视图的其他客户端不会被屏蔽过长时间。
3.view_name :视图名
4.select_statement :
select_statement 是一种SELECT语句,它给出了视图的定义。该语句可从基表或其他视图进行选择。
该语句要求具有针对视图的CREATE VIEW权限,以及针对由SELECT语句选择的每一列上的某些权限。对于在SELECT语句中其他地方使用的列,必须具有SELECT权限。如果还有OR REPLACE子句,必须在视图上具有DROP权限
视图属于数据库。在默认情况下,将在当前数据库创建新视图。要想在给定数据库中明确创建视图,创建时,应将名称指定为 db_name.view_name 。
mysql> CREATE VIEW test.v AS SELECT * FROM t;
表和视图共享数据库中相同的名称空间,因此,数据库不能包含具有相同名称的表和视图。
column_list
视图必须具有唯一的列名,不得有重复,默认情况下,由SELECT语句检索的列名将用作视图列名。要想为视图列定义明确的名称,可使用可选的 column_list 子句,列出由逗号隔开的ID。 column_list 中的名称数目必须等于SELECT语句检索的列数。
SELECT语句检索的列可以是对表列的简单引用。也可以是使用函数、常量值、操作符等的表达式。
对于SELECT语句中不合格的表或视图,将根据默认的数据库进行解释。通过用恰当的数据库名称限定表或视图名,视图能够引用表或其他数据库中的视图。
能够使用多种SELECT语句创建视图。视图能够引用基表或其他视图。它能使用联合、UNION和子查询。SELECT甚至不需引用任何表。
例子说明:
/*创建一个视图,名字userview */
CREATE VIEW userview
SELECT * FROM a WHERE id=1;
OR REPLACE :表示替换已有的视图名称
/*通过 OR REPLACE来替换重名的视图*/
CREATE OR REPLACE VIEW userview
SELECT * FROM a WHERE NAME="华为";
algorithm algorithm可取三个值:merge、temptable或undefined。如果没有algorithm子句,默认算法是undefined(未定义的)。算法会影响MySQL处理视图的方式。
MERGE
ALGORITHM=MERGE 不会建立临时表,而只是把条件和视图条件合并保存起来,直接去查基表,建临时表相比之下开销较大。默认的情况下,则更倾向于使用merge。
如果不指定algorithm,则更倾向于使用merge。
/*指定算法的视图ALGORITHM=MERGE */
CREATE ALGORITHM=MERGE VIEW view_merge
SELECT * FROM a WHERE NAME ="华为";
2 .TEMPTABLE
ALGORITHM=TEMPTABLE 适合于较复杂的视图,
比如有聚合函数的视图等,这种是无法合并条件去基表查询的,
需要生成一张临时表
/*指定算法的视图。
查询姓名为"华为" 的address的平均值
CREATE ALGORITHM=TEMPTABLE VIEW view_merge
SELECT AVG(address) FROM a WHERE NAME ="华为";
s
[WITH [CASCADED | LOCAL] CHECK OPTION]
对于可更新视图,可给定WITH CHECK OPTION子句来防止插入或更新行,除非作用在行上的 select_statement 中的WHERE子句为“真”。
在关于可更新视图的WITH CHECK OPTION子句中,当视图是根据另一个视图定义的时,LOCAL和CASCADED关键字决定了检查测试的范围。LOCAL关键字对CHECK OPTION进行了限制,使其仅作用在定义的视图上,CASCADED会对将进行评估的基表进行检查。如果未给定任一关键字,默认值为CASCADED。请考虑下述表和视图集合的定义:
/*创建一张表*/
CREATE TABLE t1 (a INT);
/*创建一个条件a<2的V1视图*/
CREATE VIEW v1
SELECT * FROM t1 WHERE a < 2
WITH CHECK OPTION;
/*根据view_a视图创建v2视图*/
CREATE VIEW v2
SELECT * FROM v1 WHERE a > 0
WITH LOCAL CHECK OPTION;
/*根据view_a视图创建v3视图*/
CREATE VIEW v3
SELECT * FROM v1 WHERE a > 0
WITH CASCADED CHECK OPTION;
这里,视图v2和v3是根据另一视图v1定义的。v2具有LOCAL检查选项,因此,仅会针对v2检查对插入项进行测试。v3具有CASCADED检查选项,因此,不仅会针对它自己的检查对插入项进行测试,也会针对基本视图的检查对插入项进行测试。在下面的语句中,介绍了这些差异:
/*在视图v2中插入数据a=1*/
INSERT INTO v2 VALUES(1);
/*在视图v2中插入数据a=2*/
INSERT INTO v3 VALUES(2);
视图的可更新性受到v1视图条件的限制
修改视图
ALTER VIEW语法
ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
该语句用于更改已有视图的定义。其语法与CREATE VIEW类似。该语句需要具有针对视图的CREATE VIEW和DROP权限,也需要针对SELECT语句中引用的每一列的某些权限。
修改视图前
修改视图后
/*修改视图*/
ALTER VIEW view_a
AS SELECT id,NAME
FROM a ;
a
删除视图
语法:
DROP VIEW [IF EXISTS]
view_name [, view_name] ...