视图是从一个或多个表/视图中导出来的虚拟表。mysql支持可更新的视图。
1 创建
CREATE
[OR REPLACE] ##使用这个选项,若视图已存在,则等图create,若视图不存在,则等同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]
注意事项:
a 在同一个数据库中,视图和表拥有同一个namespace,因此不能有相同的名字。
b select语句中不能含有子查询
c select语句中不能涉及系统变量和用户自定义变量
d 如果有存储过程,函数,定时器等等,select语句中不能有他们的参数
e select中不能有prepared语句的参数
f 创建时所涉及的表和列必须存在,如果后来某些表或者列被删除,使用这个视图时会报错
g 创建时不能涉及临时表,也不能创建‘临时视图’
h 不能关联触发器。 因此information_schema和performance_schema中的表都不能与触发器关联。
i select语句中的别名不能超过列的最大长度(64个字母),而非一般别名最大长度(256字母)。
j 创建时允许在select中添加order by语句,不过如果是从含有order by语句的视图中选取的列,此时添加的order by语句会被自动忽略。
示例:
CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t;
2 查看
DESCRIBE 视图名;
或者:
SHOW TABLE STATUS LIKE '视图名';
或者:
SHOW CREATE VIEW 视图名;
或者:
SELECT * FROM information_schema.views;
3 修改
create or replace语句(如1中所言)
或者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]
4 更新
视图为虚拟表,没有数据。在视图中添加,修改,删除数据实际上是在其原始表中进行的。因此视图并不会对性能有太大影响。但是在某些情形下,视图是不能更新的:
a 含有聚合函数
b distinct
c group by
d having
e union 或者union all
f 含有子查询
g 有join等语句(联表查询)
h 涉及其他不可更新视图
i 只含有不含表信息的参数
j ALGORITHM = TEMPTABLE
k 对表中的某行多次引用
5 删除
DROP VIEW [IF EXISTS]
view_name [, view_name] ...
[RESTRICT | CASCADE]