• sql必知必会(第四版) 学习笔记二 视图


    本书用到的几个表的建表sql语句如下:

    --销售产品供应商
    CREATE TABLE Vendors    (
       vend_id varchar(20) not null,
       vend_name varchar(50) not null,
       vend_address varchar(100),
      vend_city varchar(100),
      vend_state varchar(100),   
      vend_zip varchar(20),
      vend_country varchar(100),
      PRIMARY KEY(vend_id),  
    )
    go
    
    --产品表
    CREATE TABLE Products(
        prod_id  varchar(20) not null,
       vend_id varchar(20) not null,
      prod_name varchar(100) not null,
      prod_price float,
      prod_desc  varchar(200),
      PRIMARY KEY(prod_id),
      FOREIGN KEY(vend_id) REFERENCES Vendors(vend_id)
    )
    go
    --顾客表
    CREATE TABLE Customers(
      cust_id varchar(20),
      cust_name varchar(100),
      cust_address varchar(100),
      cust_city varchar(100),
      cust_state varchar(100),
      cust_country varchar(100),
      cust_contact varchar(100),
      cust_email varchar(100),
      PRIMARY KEY(cust_id)
    )
    go
    --订单表
    CREATE TABLE Orders(
        order_num varchar(20),
       order_date date,
      cust_id varchar(20),
      PRIMARY KEY(order_num),
      FOREIGN KEY(cust_id) REFERENCES Customers(cust_id)  
    )
    go
    --OrderItems表 存储每个订单中的实际物品
    CREATE TABLE OrderItems(
     order_num varchar(20),
     order_item varchar(20),
      prod_id  varchar(20),
      quantity int,
      item_price float,
      FOREIGN KEY(order_num) REFERENCES Orders(order_num),
      FOREIGN KEY(prod_id) REFERENCES Products(prod_id)
    )
    
    --视图
    /*
      1 视图是虚拟的表,只包含使用时动态检索数据的查询
      2 视图中包含的数据是从其他表中检索出来的,当这些表中数据改变时视图中数据也将返回改变过得数据
      3 在特定条件下也可以通过视图的修改影响基表数据
    
    */
    
    
    --通过联合查询 来查询订购了某种产品的顾客信息
    select cust_name,cust_address,cust_contact
    from Customers,Orders,OrderItems
    where OrderItems.order_num = Orders.order_num and Customers.cust_id  = Orders.cust_id
    and prod_id = 001;
    
    --上面的话我们可以通过修改prod_id号,查询产品所订购者的顾客信息,但是每次都这么写就略繁琐了
    --如果我们把上面所需要的列数据写到一个视图中 然后在视图中进行相关查询 就简便了很多
    go
    create view ProductCustomer as
    select cust_name,cust_address,cust_contact,prod_id
    from Customers,Orders,OrderItems
    where OrderItems.order_num = Orders.order_num and Customers.cust_id  = Orders.cust_id
    
    --上面创建的视图中就包含了,cust_name,cust_address,cust_contact,prod_id 所对应的一张视图
    --可以查询视图得到想要的结果 和上面效果一样
    
    select cust_name,cust_address,cust_contact
    from ProductCustomer
    where prod_id = 001
    
    --这种情况修改涉及到了两个表 不能进行更新
    update ProductCustomer2  set cust_name = '张三(修正5)',order_date='1999-1-1'
    where cust_name = '张三(修正4)'
    
    --涉及到一张表 所以可以
    update Customers set cust_name = '张三(修正2)',cust_address = '皇家计量大学院'
    where cust_name =  '张三(修正)'
    
    
    

    可更新视图
    只要满足下列条件,即可通过视图修改基础基表的数据:

    任何修改(包括 UPDATE、INSERT 和 DELETE 语句)都只能引用一个基表的列。

    视图中被修改的列必须直接引用表列中的基础数据。不能通过任何其他方式对这些列进行派生,如通过以下方式:

    聚合函数:AVG、COUNT、SUM、MIN、MAX、GROUPING、STDEV、STDEVP、VAR 和 VARP。

    计算。不能从使用其他列的表达式中计算该列。使用集合运算符 UNION、UNION ALL、CROSSJOIN、EXCEPT 和 INTERSECT 形成的列将计入计算结果,且不可更新。

    被修改的列不受 GROUP BY、HAVING 或 DISTINCT 子句的影响。

    上述限制适用于视图的 FROM 子句中的任何子查询,就像其应用于视图本身一样。通常情况下,数据库引擎 必须能够明确跟踪从视图定义到一个基表的修改。

    我对视图的一点理解:

         通过视图我们可以把几张表中相关的有用信息提取到一张表(视图)中,虽然视图在数据库中不存在,是虚拟的表,但是我们可以通过查找视图获得我们想查找的数据,简化了复杂的SQL操作。

    CSDN有篇比较好的博客讲视图的,连接如下:

    http://blog.csdn.net/jbhou/article/details/3176262

     

       

  • 相关阅读:
    山东财经大学新生赛暨天梯赛选拔赛 A 骆驼拼写法
    Code 墓地 问题 A: 看电视(区间贪心)
    第九届蓝桥杯 乘积尾零(Java大数)
    《真正的力量来自内心深处》
    蓝桥杯训练 历届试题 买不到的数目 (猜公式)
    前缀和与差分 算法详解
    蓝桥杯训练 历届试题 回文数字 (暴力求解,毫无任何技术含量)
    蓝桥杯训练 历届试题 最大子阵 (只用了前缀和,没用dp写)
    实习开始
    MVC缺点总结
  • 原文地址:https://www.cnblogs.com/KingsWang/p/3392576.html
Copyright © 2020-2023  润新知