• 18 使用视图


    1.视图

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

    12课的列子,用SELECT语句从三个表中检索数据,列出订购物品'RGAN01'的所有顾客。输入:

    SELECT cust_name, cust_contact

    FROM Customers, Orders, OrderItems

    WHERE Customers.cust_id = Orders.cust_id

    AND OrderItems.order_num = Orders.order_num

    AND prod_id= 'RGAN01';

    输出:

    要检索其他产品的相同数据,必须修改最后的WHERE子句。

    假设可以把整个查询包装成一个名为ProductCustomers的虚拟表,可以如下检索出相同的数据,输入:

    SELECT cust_name, cust_contact

    FROM ProductCustomers

    WHERE prod_id= 'RGAN01';

    ProductCustomers是一个视图,不包含任何列或查询,包含的是一个查询。

    (1)为什么使用视图

    视图的常见应用:

    • 重用SQL语句;
    • 简化复杂的SQL操作,在编写查询后,可以方便地重用它,而不必知道其基本查询细节;
    • 使用表的一部分而不是整个表;
    • 保护数据,可以之手与用户访问表的特定部分的权限;
    • 更改数据格式和表示,可以返回与底层表的表示和格式不同的数据。

    可以对视图执行与表相同的使用方式,如SELECT操作,过滤和排序数据,将视图联结到其他视图或表,添加和更新数据。

    (2)视图的规则和限制

    • 与表一样,视图必须唯一命名(不能与其他视图或表重名);
    • 对于可以创建的视图数目没有限制;
    • 创建视图,必须有足够的访问权限;
    • 视图可以嵌套,但所允许的嵌套层数可能不同;
    • 许多DBMS禁止在视图查询中年使用ORDER BY子句;
    • 有些DBMS要求对返回的所有列进行命名,如果列是计算字段,则需要使用别名;
    • 视图不能索引,也不能有关联的触发器或默认值;
    • 有些DBMS把视图作为只读的查询,即可以从视图检索数据,但不能将数据写回底层表;
    • 有些DBMS允许创建这样的视图,它不能进行导致行不再属于视图的插入或更新。

    2.创建视图

    CREATE VIEW语句来创建视图,只能用于创建不存在的视图。

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

    一个最常见的视图应用是隐藏复杂的SQL

    输入:

    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;

    SQL语句创建一个名为ProductCustomers的视图,它联结三个表:CustomersOrdersOrderItems,返回已订购了任意产品的所有顾客的列表。

    检索订购了产品RGAN01的顾客,输入:

    SELECT cust_name, cust_contact

    FROM ProductCustomers

    WHERE prod_id = 'RGAN01';

    输出:

    如果执行SELECT * FROM ProductCustomers,输出订购了任意产品的顾客。

    SQL语句通过WHERE子句从视图中检索特定数据。

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

    7课中,使用SELECT语句,在单个组合计算列中返回供应商和位置。

    输入:

    SELECT Concat(vend_name, ' (', RTRIM(vend_country), ')')

    AS vend_title

    FROM Vendors

    ORDER BY vend_name;

    输出:

    ‚下面使用了||语法,输入:

    SELECT RTRIM(vend_name) || ' (', RTRIM(vend_country) || ')'

    AS vend_title

    FROM Vendors

    ORDER BY vend_name;

    输出:好像不适用于MySQL

    ƒ将该查询转换为视图,输入:

    CREATE VIEW VendorLocations AS

    SELECT Concat(vend_name, ' (', RTRIM(vend_country), ')')

    AS vend_title

    FROM Vendors;

    要检索数据,创建所有的邮件标签,输入:

    SELECT *

    FROM VendorLocations;

    输出:

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

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

    CREATE VIEW CustomersEMailList AS

    SELECT cust_id, cust_name, cust_email

    FROM Customers

    WHERE cust_email IS NOT NULL;

    删除:DROP VIEW CustomersEMailList;

    输入:

    SELECT *

    FROM CustomersEMailList

    WHERE cust_email IS NOT NULL;

    输出:

    怎样过滤掉NULL的数据?

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

    输入:

    SELECT prod_id,

    quantity,

    item_price,

    quantity*item_price AS expanded_price

    FROM OrderItems

    WHERE order_num = 20008;

    输出:

    将其准换为一个视图,输入:

    CREATE VIEW OrderItemsExpanded AS

    SELECT order_num,

    prod_id,

    quantity,

    item_price,

    quantity*item_price AS expanded_price

    FROM OrderItems;

    检索订单20008的详细内容,输入:

    SELECT *

    FROM OrderItemsExpanded

    WHERE order_num = 20008;

    输出:

  • 相关阅读:
    Docker中查看Mysql数据库中的各环境参数
    Hbase shell 输入无法使用退格键删除解决办法
    HBase启动时报错:/bin/java: No such file or directory6/bin/../bin/hbase: line 412: /usr/local/jdk1.8.0_152/bin/java
    SSH无密码验证
    详解分布式应用程序协调服务Zookeeper
    zookeeper的原理及使用
    Hadoop、Yarn和vcpu资源的配置
    一文让您全面了解清楚HBase数据库的所有知识点,值得收藏!
    基于Docker一键部署大规模Hadoop集群及设计思路
    PHP ServerPush (推送) 技术的探讨【转】
  • 原文地址:https://www.cnblogs.com/Sumomo0516/p/6131593.html
Copyright © 2020-2023  润新知