sql必知必会(第四版) 学习笔记二 视图
本書用到的幾個表的建表sql語句如下:
--銷售產(chǎn)品供應商 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--產(chǎn)品表 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 視圖是虛擬的表,只包含使用時動態(tài)檢索數(shù)據(jù)的查詢2 視圖中包含的數(shù)據(jù)是從其他表中檢索出來的,當這些表中數(shù)據(jù)改變時視圖中數(shù)據(jù)也將返回改變過得數(shù)據(jù)3 在特定條件下也可以通過視圖的修改影響基表數(shù)據(jù)*/--通過聯(lián)合查詢 來查詢訂購了某種產(chǎn)品的顧客信息 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號,查詢產(chǎn)品所訂購者的顧客信息,但是每次都這么寫就略繁瑣了 --如果我們把上面所需要的列數(shù)據(jù)寫到一個視圖中 然后在視圖中進行相關查詢 就簡便了很多 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--上面創(chuàng)建的視圖中就包含了,cust_name,cust_address,cust_contact,prod_id 所對應的一張視圖 --可以查詢視圖得到想要的結(jié)果 和上面效果一樣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 = '張三(修正)' 可更新視圖
只要滿足下列條件,即可通過視圖修改基礎基表的數(shù)據(jù):
任何修改(包括 UPDATE、INSERT 和 DELETE 語句)都只能引用一個基表的列。
視圖中被修改的列必須直接引用表列中的基礎數(shù)據(jù)。不能通過任何其他方式對這些列進行派生,如通過以下方式:
聚合函數(shù):AVG、COUNT、SUM、MIN、MAX、GROUPING、STDEV、STDEVP、VAR 和 VARP。
計算。不能從使用其他列的表達式中計算該列。使用集合運算符 UNION、UNION ALL、CROSSJOIN、EXCEPT 和 INTERSECT 形成的列將計入計算結(jié)果,且不可更新。
被修改的列不受 GROUP BY、HAVING 或 DISTINCT 子句的影響。
上述限制適用于視圖的 FROM 子句中的任何子查詢,就像其應用于視圖本身一樣。通常情況下,數(shù)據(jù)庫引擎 必須能夠明確跟蹤從視圖定義到一個基表的修改。
我對視圖的一點理解:
???? 通過視圖我們可以把幾張表中相關的有用信息提取到一張表(視圖)中,雖然視圖在數(shù)據(jù)庫中不存在,是虛擬的表,但是我們可以通過查找視圖獲得我們想查找的數(shù)據(jù),簡化了復雜的SQL操作。
CSDN有篇比較好的博客講視圖的,連接如下:
http://blog.csdn.net/jbhou/article/details/3176262
from:?http://www.cnblogs.com/KingsWang/p/3392576.html
總結(jié)
以上是生活随笔為你收集整理的sql必知必会(第四版) 学习笔记二 视图的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sql必知必会(第四版) 学习笔记一
- 下一篇: MySQL索引知识总结