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

 

   

原文地址:https://www.cnblogs.com/KingsWang/p/3392576.html