zoukankan      html  css  js  c++  java
  • MySQL学习笔记20

    二十、使用视图

    1、 视图

    视图是虚拟的表。与包含数据的表不一样,视图只包含使用时动态检索数据的查询。

    例如:SELECT cust_name, cust_contact

          FROM customers, orders, orderitems

          WHERE customers.cust_id = orders.cust_id

             AND orderitems.order_num = order.order_num

             AND prod_id = ‘TNT2’;

       此查询用来检索订购了某个特定产品的用户。可以看到检索语句比较复杂,另外如果要检索其他产品的相同数据,必须修改最后的WHERE子句。

       如果把整个查询包装成一个名为productcustomers的虚拟表,则可以如下轻松地检索出相同的数据:

         SELECT cust_name, cust_contact

         FROM productcustomers

         WHERE prod_id = ‘TNT2’;

    为什么使用视图

    •       重用SQL语句
    •       简化复杂的SQL操作
    •    使用表的组成部分而不是整个表
    •       保护数据
    •       更改数据格式和表示

    视图仅仅是用来查看存储在别处的数据的一种设施,视图本身不包含数据。

    视图的规则和限制:

    •       与表一样,视图必须唯一命名。
    •       对于可以创建的视图数目没有限制
    •       为了创建视图,必须具有足够的访问权限
    •       视图可以嵌套。即可以利用从其他视图中检索数据的查询来构造一个视图
    •       ORDER BY可以用在视图中,但如果从该视图检索数据的SELECT语句中也含有ORDER BY,那么该视图中的ORDER BY将被覆盖
    •       视图不能被索引,也不能有关联的触发器或默认值
    •       视图可以和表一起使用

    2、 使用视图

    视图的创建:

    •    视图用CREATE VIEW语句来创建
    •    使用SHOW CREATE VIEW viewname;来查看创建视图的语句
    •    用DRO删除视图,其语法为DROP VIEW viewname;。
    •    更新视图时,可以先用DROP再用CREATE,也可以直接用CREATE OR REPLACR VIEW。如果要更新的视图不存在,则第二条更新语句会创建一个视图;如果更新的视图存在,则第二条更新语句会替换原有视图。

    (1)、利用视图简化复杂的联结

       例如:CREATE VIEW productcustomers AS

             SELECT cust_name, cust_contact, prod_id

             FROM customers, orders, orderitems

             WHERE customers.cust_id = orders.cust_id

                AND orderitems.order_num = orders.order_num;

          这条语句创建一个名为productcustomers的视图,它联结三个表,以返回订购了任意产品的所有客户的列表。如果执行SELECT * FROM productcustomers,将列出订购了任意产品的客户。

    为了检索订购了产品TNT2的客户,可如下进行:

    SELECT cust_name, cust_contact

    FROM productcustomets

    WHERE prod_id = ‘TNT2’;

    可以看到,视图极大地简化了复杂SQL语句的使用。利用视图,可一次性编写基础的SQL,然后根据需要多次使用。

    (2)、用视图重新格式化检索出的数据

       下面的SELECT语句在单个组合计算列中返回供应商名和位置:

       SELECT Contact(RTrim(vend_name), ’ (‘, RTrim(vend_country), ‘)’)

               AS vend_title

          FROM vendors

          ORDER BY vend_name;

    把此语句转换为视图,可按如下进 行:
         CREAT VIEW vendorlocations  AS

         SELECT Contact(RTrim(vend_name), ’ (‘, RTrim(vend_country), ‘)’)

               AS vend_title

          FROM vendors

          ORDER BY vend_name;

    (3)、用视图过滤不想要的数据

       视图对于应用普通的WHERE子句也很有用。例如,可以定义customeremaillist视图,过滤没有电子邮件的客户:

      CREATE VIEW customeremaillist AS

      SELECT cust_id, cust_name, cust_email

      FROM customers

      WHERE cust_eamil IS NOT NULL;

    (4)、使用视图与计算字段

    视图对于简化计算字段的使用特别有用。

    例如:检索某个特定订单中的物品,计算每种物品的总价格:

    SELECT prod_id,

           quantity,

           item_price,

           quantity*item_price AS expanded_price

    FROM orderitems

    WHERE order_num = 20005;

    将其转换为一个视图:

    CREATE VIEW orderitemsexpanded AS

    SELECT order_num,

           prod_id,

           quantity,

           item_price,

           quantity*item_price AS expanded_price

    FROM orderitems;

    (5)、更新视图

    视图的数据能否更新要视情况而定。

    通常视图是可以更新的(即,可以对他们使用INSERT、UPDATE和DELETE)。更新一个视图将更新其基表。如果对视图增加或删除行,实际上是对基表增加或删除行。

    但是,并非所有视图都是可更新的。如果MySQL不能正确地确定被更新的基数据,则不允许更新。如果视图定义以下操作,则不能进行视图的更新:

    •  分组(使用GROUP BY和HAVING);
    •  联结;
    •  子查询;
    •  并;
    •  聚集函数(Min()、Count()、Sum()等);
    •  DISTINCT;
    •  导出(计算)列。
  • 相关阅读:
    深度学习(十六) ReLU为什么比Sigmoid效果好
    逻辑回归和线性回归区别
    KNN理解
    词向量总结
    HTTP TCP/IP Socket
    AutoMapper控件
    Oracle数据库调优总结
    深度学习(十五) TextCNN理解
    从几张图来看看越来越难做的前端
    ES6学习笔记
  • 原文地址:https://www.cnblogs.com/D-LW/p/8992144.html
Copyright © 2011-2022 走看看