视图是从一个或多个表/视图中导出来的虚拟表。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]
posted on 2016-02-26 12:08  迷阳  阅读(990)  评论(0编辑  收藏  举报