zoukankan      html  css  js  c++  java
  • MySQL:视图

    视图

    一、视图的概述

    1. 含义:是从数据库中一个或多个表中导出的虚拟表
    2. 作用:①简单化 ②安全性 ③逻辑数据独立性
    3. 注意:一个表可以由多个视图;

    二、视图的创建

    1. 总的语法形式

    CREATE
        [OR REPLACE]
        [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
        VIEW view_name [(column_list)]
        AS select_statement
    [WITH [CASCADED | LOCAL] CHECK OPTION]
     
    介绍
    • REPLACE:表示替换已经创建的视图
    • ALGORITHM:表示视图选择的算法
    • view_name :视图名
    • column_list:属性列表
    • select_statement:select语句
    • WITH [CASCADED | LOCAL] CHECK OPTION:表示视图在更新时保证在视图的权限范围内
    • CASCADED:默认值,表示更新视图时要满足所有相关的视图和表的条件
    • LOCAL:表示更新视图时满足该视图本身定义的条件即可。
    • UNDEFINED:表示MySQL自动选择算法
    • MERGE:表示将使用视图语句与视图定义合并起来,使得视图定义的某一部分取代语句对应的部分 TEMPTABLE:表示将视图的结果存入临时表,然后用临时表来执行语句

    2. 在单表上创建视图

    语法:

    CREATE VIEW 视图名 [(视图字段,……,字段n)] AS select 表字段名,……,表字段名n  from 数据表;
    CREATE or replace VIEW 视图名 [(视图字段,……,字段n)] AS select 表字段名,……,表字段名n  from 数据表;
    语句2,如果视图没有创建,则创建;如果视图已创建,则修改视图。

    实例:

    【例】
    mysql>create view view_e(a,b,c,d,e,g,h) as select gkbh,yhm,mm,xm,xb,csrq,sfzh from guke;
    【附,显示】
    select * from view_e;
    +-------+----------+----------+------+------+------------+--------------------+
    | a     | b        | c        | d    | e    | g          | h                  |
    +-------+----------+----------+------+------+------------+--------------------+
    | 00001 | aaaaaaaa | 12345678 | 李明 | 男   | 1990-05-06 | 111111111111111111 |
    | 00002 | bbbbbbbb | 12345678 | 李逵 | 男   | 1988-05-06 | 111111111111111111 |
    | 00003 | cccccccc | 12345678 | 西施 | 女   | 1990-05-06 | 111111111111111111 |
    +-------+----------+----------+------+------+------------+--------------------+

    (2) 注意:默认情况下创建的视图和基本表的字段是一样的,也可以通过指定视图字段的名称来创建视图。

    3. 在多表上创建视图

    语法:

    CREATE VIEW 视图名 [(视图字段,……,字段n)] 
    AS A表表名.表字段名,……,A表表名.表字段名n,
    B表表名.表字段名,……,B表表名.表字段名 
    from 数据A表,数据B表 
    where 连接条件;

    实例:

    【例】
    mysql> create view view_a(订单编号,商品编号,顾客编号,订单日期) 
    as select dingdanxiangqing.ddbh,dingdanxiangqing.spbh,
    dingdan.gkbh,dingdan.ddrq 
    from dingdan,dingdanxiangqing 
    where dingdanxiangqing.ddbh=dingdan.ddbh;
    【附,效果】
    mysql> select * from view_a;
    +----------+----------+----------+---------------------+
    | 订单编号 | 商品编号 | 顾客编号 | 订单日期            |
    +----------+----------+----------+---------------------+
    |        1 | 00000001 | 00001    | 2016-01-01 00:00:00 |
    |        2 | 00000003 | 00003    | 2016-02-10 00:00:00 |
    |        1 | 00000004 | 00001    | 2016-01-01 00:00:00 |
    +----------+----------+----------+---------------------+

    三、视图的查看

    语法:

    desc 视图表

    实例:

    【例】
    mysql> desc view_a;
    +----------+----------+------+-----+---------+-------+
    | Field    | Type     | Null | Key | Default | Extra |
    +----------+----------+------+-----+---------+-------+
    | 订单编号 | int(11)  | NO   |     | 0       |       |
    | 商品编号 | char(8)  | NO   |     |         |       |
    | 顾客编号 | char(5)  | NO   |     | NULL    |       |
    | 订单日期 | datetime | NO   |     | NULL    |       |
    +----------+----------+------+-----+---------+-------+

    作用:显示视图的字段定义、字段的数据类型、是否为空、是否是主键外键、默认值和额外信息

    语法

    show table status like'视图表名’G;

    实例

    mysql> show table status like'view_a';
    +--------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+
    | Name   | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length |
    +--------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+
    | view_a | NULL   |    NULL | NULL       | NULL |           NULL |  NULL       |            NULL |         NULL |
    +--------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+
    -----------+----------------+-------------+-------------+------------+-----------+----------+----------------+
     Data_free |Auto_increment  | Create_time | Update_time | Check_time | Collation |Checksum | Create_options  |
    -----------+----------------+-------------+-------------+------------+-----------+----------+----------------+
          NULL |  NULL          |NULL         | NULL        | NULL       | NULL      |    NULL  |       NULL     |
    -----------+----------------+-------------+-------------+------------+-----------+----------+----------------+
    ---------+
     Comment |
    ---------+
     VIEW    |
    ---------+
    
    或者mysql>show table status like'view_a'G;
    
    *************************** 1. row ***************************
               Name: view_a
             Engine: NULL
            Version: NULL
         Row_format: NULL
               Rows: NULL
     Avg_row_length: NULL
        Data_length: NULL
    Max_data_length: NULL
       Index_length: NULL
          Data_free: NULL
     Auto_increment: NULL
        Create_time: NULL
        Update_time: NULL
         Check_time: NULL
          Collation: NULL
           Checksum: NULL
     Create_options: NULL
            Comment: VIEW

    作用:显示视图的存储引擎,创建时间

    语法

    show create view 视图名

    实例

    【例】
    mysql> show create view view_aG;
    *************************** 1. row ***************************
                    View: view_a
             Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `view_a` AS select `dingdanxiangqing`.`ddbh` AS `订单编号`,`dingdanxiangqing`.`spbh` AS `商品编号`,`dingdan`.`gkbh` AS `顾客编号`,`dingdan`.`ddrq` AS `订单日期` from (`dingdan` join `dingdanxiangqing`) where (`dingdanxiangqing`.`ddbh` = `dingdan`.`ddbh`)
    character_set_client: gbk
    collation_connection: gbk_chinese_ci

    作用:显示视图的名称和创建语句

    语法

    select * from information_schema.viewsG;

    实例

    mysql> select * from information_schema.viewsG;
    *************************** 1. row ***************************
           TABLE_CATALOG: def
            TABLE_SCHEMA: webshop
              TABLE_NAME: view_a
         VIEW_DEFINITION: select `webshop`.`dingdanxiangqing`.`ddbh` AS `订单编号`,`webshop`.`dingdanxiangqing`.`spbh` AS `商品编号`,`webshop`.`dingdan`.`gkbh` AS `顾客编号`,`webshop`.`dingdan`.`ddrq` AS `订单日期` from `webshop`.`dingdan` join `webshop`.`dingdanxiangqing` where (`webshop`.`dingdanxiangqing`.`ddbh` = `webshop`.`dingdan`.`ddbh`)
            CHECK_OPTION: NONE
            IS_UPDATABLE: YES
                 DEFINER: root@localhost
           SECURITY_TYPE: DEFINER
    CHARACTER_SET_CLIENT: gbk
    COLLATION_CONNECTION: gbk_chinese_ci
    作用:显示所有的数据表

    四、视图的修改

    ①CREATE语句
    总的语法

    CREATE
        [OR REPLACE]
        [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
        VIEW view_name [(column_list)]
        AS select_statement
    [WITH [CASCADED | LOCAL] CHECK OPTION]

    简化版

    CREATE or replace view 视图名 as select 表字段 from 表名

    注意:该语法与创建语法完全一样,当视图不存在时,此语法是创建视图;视图存在时,此语法是修改视图;

    ②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]

    简化版:

    ALTER view 视图名 as select 表字段 from 表名

    五、视图的更新

    注意:
    ①因为视图是虚拟表所以,所以对视图的操作,实际上是对基本表的操作;
    ②对其中的一个视图更新后,其基本表也更新了,从而与这个基本表相关的视图表的内容也更新。
    ③不可以更新的视图
    1.包含以下关键字的sql语句:聚合函数(sum、min、max、count)、distinct、group by 、having、union 或者uinon all
    2.常量视图
    3.select 中包含子查询
    4.join
    5.from一个不可更新的试图
    6.where字句的子查询引用了from字句中的表
    (1)更新视图
     语法:

    update 视图名 set 更新数据;
    实例:
      原数据表:
       mysql> select * from guke;
    +-------+------+------------+
    | gkbh  | xm   | csrq       |
    +-------+------+------------+
    | 00001 | 李明 | 1990-05-06 |
    | 00002 | 李逵 | 1988-05-06 |
    | 00003 | 西施 | 1990-05-06 |
    +-------+------+------------+
       原视图:
       mysql> select * from view_c;
    +----------+------+------------+
    | 顾客编号 | 姓名 | 出生日期   |
    +----------+------+------------+
    | 00001    | 李明 | 1990-05-06 |
    | 00002    | 李逵 | 1988-05-06 |
    | 00003    | 西施 | 1990-05-06 |
    +----------+------+------------+
       改后:
       视图:
       mysql> update view_c set 姓名='哈哈在笑' where 顾客编号='00002';
       mysql> select * from view_c;
    +----------+----------+------------+
    | 顾客编号 | 姓名     | 出生日期   |
    +----------+----------+------------+
    | 00001    | 哈哈一笑 | 1990-05-06 |
    | 00002    | 哈哈在笑 | 1988-05-06 |
    | 00003    | 哈哈一笑 | 1990-05-06 |
    +----------+----------+------------+
      基本表:
      mysql> select gkbh,xm,csrq from guke;
    +-------+----------+------------+
    | gkbh  | xm       | csrq       |
    +-------+----------+------------+
    | 00001 | 哈哈一笑 | 1990-05-06 |
    | 00002 | 哈哈在笑 | 1988-05-06 |
    | 00003 | 哈哈一笑 | 1990-05-06 |
    +-------+----------+------------+

    注意:基本表已经改变
    (2)插入记录
     语法:

    insert into 数据表名 values(插入的数据,……,插入的数据n);

    六、视图的删除

    1. 总的语法

    DROP VIEW [IF EXISTS]
        view_name [, view_name] ...
        [RESTRICT | CASCADE]
     
  • 相关阅读:
    如何使用Flexbox和CSS Grid,实现高效布局
    最常用的四种大数据分析方法
    如何编写更好的SQL查询:终极指南-第三部分
    如何编写更好的SQL查询:终极指南-第二部分
    如何编写更好的SQL查询:终极指南-第一部分
    ES2017异步函数现已正式可用
    相对传统桌面设计器,在线报表设计器价值何在?
    如何实现报表设计中的高精度报表套打?
    2017年前端开发工具趋势
    Angular2 VS Angular4 深度对比:特性、性能
  • 原文地址:https://www.cnblogs.com/hahayixiao/p/10252139.html
Copyright © 2011-2022 走看看