Mysql 视图
一、创建视图:
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
[OR REPLACE]:
中括号中的 OR REPLACE
关键字是可选的。如果当前数据库中已经存在指定名称的视图时,没有该关键字,将会提示错误信息;
如果使用了 OR REPLACE
关键字,则当前正在创建的视图会覆盖掉原来同名的视图。
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]:
ALGORITHM
子句是可选的,它表示使用何种算法来处理视图。此外,它并不属于标准SQL的一部分,而是MySQL对标准SQL进行的功能扩展。 ALGORITHM
可以设置三个值: MERGE
、 TEMPTABLE
或 UNDEFINED
。如果没有 ALGORITHM
子句,则默认值为 UNDEFINED
(未定义的)。 对于 MERGE
,会将引用视图的语句的文本与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分。
对于TEMPTABLE
,视图的结果将被置于临时表中,然后使用它执行语句。
对于UNDEFINED
,MySQL将选择所要使用的算法。如果可能,它倾向于MERGE
而不是TEMPTABLE
,这是因为MERGE
通常更有效,而且如果使用了临时表,视图是不可更新的。
之所以提供TEMPTABLE
选项,是因为TEMPTABLE
在创建临时表之后、并在完成语句处理之前,能够释放基表上的锁定。与MERGE
算法相比,锁定释放的速度更快,这样,使用视图的其他客户端不会被屏蔽过长时间。
此外,MERGE
算法要求视图中的行和基表中的行具有一对一的关系。如果视图包含聚合函数(SUM()
, MIN()
, MAX()
, COUNT()
等)、DISTINCT
、GROUP BY
、HAVING
、UNION
或UNION ALL
、没有基表的引用文字值(例如:SELECT 'hello';
)等结构中的任何一种,将失去一对一的关系,此时必须使用临时表取而代之。
[(column_list)]:
(column_list)
用于自定义视图中各个字段的名称。如果没有该命令选项,那么通过视图查询到的各个字段的名称和视图所使用到的数据表的字段名称保持一致。
CREATE OR REPLACE VIEW v_user
AS
SELECT id, username FROM user;
由于user
表中的字段名称为id
和username
,因此视图v_user
中的两个字段名称也分别默认为id
和username
。现在,我们将视图v_user
中的字段名称分别自定义为uid
和uname
。
CREATE OR REPLACE VIEW v_user (uid, uname)
AS
SELECT id, username FROM user;
二:删除视图
DROP VIEW [IF EXISTS]
view_name [, view_name2]...
关键字IF EXISTS
用于防止因视图不存在而提示出错,此时,只有存在该视图才会执行删除操作。
DROP VIEW
语句可以一次性删除多个视图,只需要在多个视图名称之间以英文逗号隔开即可。如果多个视图存在于不同的数据库中,不数据当前数据库的视图名称之前还必须加上db_name.
前缀。
drop view v_user
三:修改视图
1、使用 CREATE OR REPLACE VIEW
2、用 ALTER 语句修改视图
ALTER [ALGORITHM={ UNDEFINED | MERGE | TEMPTABLE }]
VIEW view_name [( column_list )]
AS SELECT_statement
[ WITH | [ CASCADED | LOCAL ] CHECK OPTION];
例如:
ALTER VIEW v_user AS SELECT .........
四:查看视图
show tables:
不仅可以用于查看当前数据库中存在哪些数据表,同时也可以查看到当前数据库中存在哪些视图,但是不显示类型,不好区分表和视图;
show full tables:
该命令可以列出额外的table_type
列,如果对应输出行上该列的值为"VIEW",则表示这是一个视图;
show create view view_name :查看创建该视图的详细语句
参考:https://www.cnblogs.com/jpfss/p/11004700.html