利用視圖簡(jiǎn)化復(fù)雜的聯(lián)結(jié)
視圖的最常見(jiàn)的應(yīng)用之一是隱藏復(fù)雜的SQL,這通常都會(huì)涉及聯(lián)結(jié)。請(qǐng)看下面的例子:
輸入:
create?view?productcustomers?as?select?cust_name,cust_contact,prod_id?from?customers,orders,orderitems?where?customers.cust_id?=?orders.cust_id?and?orderitems.order_num?=?orders.order_num;
分析:這條語(yǔ)句創(chuàng)建一個(gè)名為 productcustomers 的視圖,它聯(lián)結(jié)三個(gè)表,以返回已訂購(gòu)了任意產(chǎn)品的所有客戶(hù)的列表。如果執(zhí)行SELECT * FROM productcustomers ,將列出訂購(gòu)了任意產(chǎn)品的客戶(hù)。
為檢索訂購(gòu)了產(chǎn)品 TNT2 的客戶(hù),可如下進(jìn)行:
輸入:
select?cust_name,cust_contact?from?productstomers?where?prod_id?=?'TNT2';
輸出:
分析:這條語(yǔ)句通過(guò) WHERE 子句從視圖中檢索特定數(shù)據(jù)。在MySQL處理此查詢(xún)時(shí),它將指定的 WHERE 子句添加到視圖查詢(xún)中的已有WHERE 子句中,以便正確過(guò)濾數(shù)據(jù)。
可以看出,視圖極大地簡(jiǎn)化了復(fù)雜sql語(yǔ)句的使用。利用視圖,可一次性編寫(xiě)基礎(chǔ)的SQL,然后根據(jù)需要多次使用。
創(chuàng)建可重用的視圖 創(chuàng)建不受特定數(shù)據(jù)限制的視圖是一種好辦法。例如,上面創(chuàng)建的視圖返回生產(chǎn)所有產(chǎn)品的客戶(hù)而不僅僅是 生產(chǎn)TNT2 的客戶(hù)。擴(kuò)展視圖的范圍不僅使得它能被重用,而且甚至更有用。這樣做不需要?jiǎng)?chuàng)建和維護(hù)多個(gè)類(lèi)似視圖。
用視圖重新格式化檢索出的數(shù)據(jù)
如上所述,視圖的另一常見(jiàn)用途是重新格式化檢索出的數(shù)據(jù)。下面的 SELECT 語(yǔ)句在單個(gè)組合計(jì)算列中返回供應(yīng)商名和位置:
輸入:
select?concat(rtrim(vend_name),'(',rtrim(vend_country),?')')?as?vend_title?from?vendors?order?by?vend_name;
輸出:
現(xiàn)在,假如經(jīng)常需要這個(gè)格式的結(jié)果。不必在每次需要時(shí)執(zhí)行聯(lián)結(jié),創(chuàng)建一個(gè)視圖,每次需要時(shí)使用它即可。為把此語(yǔ)句轉(zhuǎn)換為視圖,可按如下進(jìn)行:
輸入:
create?view?vendorlocation?as?select?concat(rtrim(vend_name),'(',rtrim(vend_country),?')')?as?vend_title?from?vendors?order?by?vend_name;
分析:這條語(yǔ)句使用與以前的 SELECT 語(yǔ)句相同的查詢(xún)創(chuàng)建視圖。為了檢索出以創(chuàng)建所有郵件標(biāo)簽的數(shù)據(jù),可如下進(jìn)行:
輸入:
select?*?from?vendorlocations;
輸出: