本书用到的几个表的建表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有篇比较好的博客讲视图的,连接如下: