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

来源:互联网 发布:寻龙诀 知乎 编辑:程序博客网 时间:2024/06/06 07:46

本书用到的几个表的建表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_contactfrom Customers,Orders,OrderItemswhere OrderItems.order_num = Orders.order_num and Customers.cust_id  = Orders.cust_idand prod_id = 001;--上面的话我们可以通过修改prod_id号,查询产品所订购者的顾客信息,但是每次都这么写就略繁琐了--如果我们把上面所需要的列数据写到一个视图中 然后在视图中进行相关查询 就简便了很多gocreate view ProductCustomer asselect cust_name,cust_address,cust_contact,prod_idfrom Customers,Orders,OrderItemswhere 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_contactfrom ProductCustomerwhere 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


from: http://www.cnblogs.com/KingsWang/p/3392576.html

原创粉丝点击