zoukankan      html  css  js  c++  java
  • mysql入门-视图

    本系列内容基本上是从一本叫做《Mysql入门很简单》上面整理的。如果侵犯了你的权益,告诉我,我删掉!

    视图

    一、视图的基础

    视图是从一个或多个表中导出来的虚拟表。

    1、视图需要达到的目的就是所见即所需,视图可以简化对数据的操作。
    2、通过视图,用户只能查询和修改指定的数据。
    3、视图可以屏蔽原有表结构变化带来的影响

    二、基础操作

    CREATE [ ALGORITHM={ UNDEFINED | MERGE | TEMPTABLE }] --ALGORITHM表示视图选择的算法UNDEFINED自动选择,
    VIEW 视图名 [( 属性清单 )] --MERGE表示将视图的语句与视图定义合并起来,使得视图定义的某一部分取代语句对应部分
    AS SELECT语句 --TEMPTABLE表示将视图的结果存入临时表,使用临时表执行语句
    [ WITH [ CASCADED|LOCAL ] CHECK OPTION ] ; --WITH CHECK OPTION 更新视图时要保证在该视图的权限范围之内
    --CASCADED表示更新视图时要满足所有相关视图和表的条件,该参数为默认值
    --LOCAL表示更新视图时,要满足该视图本身的定义的条件即可。

    使用CREATE VIEW语句创建视图时,最好加上WITH CHECK OPTION 和 CASCADED参数参数。
    这样,从视图上派生出来的新视图后,更新新视图需要考虑其父视图的约束条件。这种方式比较严格,可以保证数据的安全性。

    ----------------------------
    CREATE VIEW department_view1 AS SELECT * FROM department; --在单个表上建立视图
    CREATE VIEW department_view2 ( name, fuction, location)
    AS SELECTd name, function, address FROM department; --在单个表上建立视图

    CREATE ALGORITHM=MERGE VIEW
    worker_view1 (name, department, sex, age, address )
    AS SELECT name, department.d_name, sex, 2009-birthday, address
    FROM worker,department
    WHERE worker.d_id=department.d_id --在多个表上建立视图
    WITH LOCAL CHECK OPTION;

    三、查看视图
    DESCRIBE 视图名
    DESC 视图名
    SHOW TABLE STATUS LIKE 视图名G;
    SHOW CREATE VIEW 视图名; --查看视图详细信息
    SELECT * FROM information_schema.views; --在view中查看视图详细信息

    四、CREATE OR REPLACE修改视图
    CREATE OR REPLACE [ ALGORITHM = { UNDEFINED|MERGE|TEMPTABLE }]
    VIEW 视图名 [( 属性清单 )]
    AS相SELECT语句
    [ WITH [ CASCADED|LOCAL ] CHECK OPTION ];
    -------------------------------
    CREATE OR REPLACE ALGORITHM=TEMPTABLE
    VIEW department_view1 (department, function, location)
    AS SELECT d_name, function, address FROM department ;

    五、ALTER语句修改视图
    ALTER [ALGORITHM={ UNDEFINED|MERGE|TEMPTABLE} ]
    VIEW 视图名 [( 属性清单 )]
    AS SELECT语句
    [WITH [ CASCADED|LOCAL] CHECK OPTION ];
    -------------------------------
    ALTER VIEW department view2 ( department, name, sex, location )
    AS SELECT d_name, worker.name, worker.sex, address
    FROM department, worker
    WHERE department.d id=worker.d id
    WITH CHECK OPTION;

    六、更新视图
    因为视图是一个虚拟表,其中没有数据。通过视图更新时,都是转换到基本表来更新。
    更新视图时,只能更新权限范围内的数据。

    6.1 先创建一个视图
    CREATE VIEW department view3( name, function, address)
    AS SELECT d_name, function, address FROM department WHERE d_id=1001;
    6.2 使用update更新视图
    UPDATE department view3 SET name=科研部',function='新产品研发",address='3号楼5层;
    6.3 表department中d_id为1001的记录已经更新。
    虽然,UPDATE语句更新的是视图department_view3。但实际上更新的是department表。
    上面的UPDATE语句可以等价为:
    UPDATE department SET d_name='科研部',function='新产品研发',address='3号楼5层' WHERE d_id=1001;
    七、视图高级查询
    7.1 视图中包含SUM()、COUNT()、MAX()、MIN()等关键字
    CREATE VIEW worker_ view4( name, sex, total)
    AS SELECTE name, sex, COUNT(name) FROM worker ;
    7.2 视图中包含UNION、UNION ALL、DISTINCT、GROUP BY和HAVIG等关键字。
    CREATE VIEW worker view5( name, sex, address)
    AS SELECT name, sex, homeaddress FROM worker GROUP BY d_id;
    7.3 常量视图
    CREATE VIEW worker_view6 AS SELECT 'Aric' as name;
    7.4 视图中的SELECT语句包含子查询
    CREATE VIEW worker view7 (name)
    AS SELECT (SELECT name FROM worker);
    7.5 由不可更新的视图导出的视图,也是不可更新的视图,执行update时会报错
    CREATE VIEW worker_view8
    AS SELECT * FROM worker_view7;
    7.6 创建视图时,ALGORITHM为TEMPTABLE类型。
    CREATE ALGORITHM=TEMPTABLE --ALGORITHM=TEMPTABLE<临时表类型>表示view9是不可更新视图
    VIEW worker view9
    AS SELECT * FROM worker;
    7.7 视图对应的表上存在没有默认值的列,而且该列没有包含在视图里。
    例如,表中包含的name字段没有默认值,但是视图中不包括该字段。那么这个视图是不能更新的。
    因为,在更新视图时,这个没有默认值的记录将没有值插入,也没有NULL值插入。
    数据库系统是不会允许这样的情况出现的,其会阻止这个视图更新。

    八、删除视图
    DROP VIEW [IF EXISTS] 视图名列表 [ RESTRICT|CASCADE ];
    --------------
    DROP VIEW IF EXISTS department_view1, department view2;

  • 相关阅读:
    sizzle编译函数
    人人都是 DBA(XII)查询信息收集脚本汇编
    人人都是 DBA(XI)I/O 信息收集脚本汇编
    人人都是 DBA(X)资源信息收集脚本汇编
    人人都是 DBA(IX)服务器信息收集脚本汇编
    人人都是 DBA(VIII)SQL Server 页存储结构
    人人都是 DBA(VII)B 树和 B+ 树
    人人都是 DBA(VI)SQL Server 事务日志
    人人都是 DBA(V)SQL Server 数据库文件
    人人都是 DBA(IV)SQL Server 内存管理
  • 原文地址:https://www.cnblogs.com/smallfishy/p/13518450.html
Copyright © 2011-2022 走看看