SQL 入門教程:創建視圖


目錄匯總:SQL 零基礎入門教程

理解了什么是 視圖 以及管理它們的規則和約束后,我們來創建視圖。

視圖用 CREATE VIEW 語句來創建。與 CREATE TABLE 一樣,CREATE VIEW 只能用於創建不存在的視圖。

說明:視圖重命名

刪除視圖,可以使用 DROP 語句,其語法為 DROP VIEW viewname;

覆蓋(或更新)視圖,必須先刪除它,然后再重新創建。

一、利用視圖簡化復雜的聯結

一個最常見的視圖應用是隱藏復雜的 SQL,這通常涉及 聯結。請看下面的例子:

輸入▼

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;

分析▼

這條語句創建一個名為 ProductCustomers 的視圖,它聯結三個表,返回已訂購了任意產品的所有顧客的列表。如果執行 SELECT * FROM ProductCustomers,將列出訂購了任意產品的顧客。

檢索訂購了產品 RGAN01 的顧客,可如下進行:

輸入▼

SELECT cust_name, cust_contact
FROM ProductCustomers
WHERE prod_id = 'RGAN01';

輸出▼

cust_name               cust_contact
-------------------     ------------------
Fun4All                 Denise L. Stephens
The Toy Store           Kim Howard

分析▼

這條語句通過 WHERE 子句 從視圖中檢索特定數據。當 DBMS 處理此查詢時,它將指定的 WHERE 子句添加到視圖查詢中已有的 WHERE 子句中,以便正確過濾數據。

可以看出,視圖極大地簡化了復雜 SQL 語句的使用。利用視圖,可一次性編寫基礎的 SQL,然后根據需要多次使用。

提示:創建可重用的視圖

創建不綁定特定數據的視圖是一種好辦法。例如,上面創建的視圖返回訂購所有產品而不僅僅是 RGAN01 的顧客(這個視圖先創建)。擴展視圖的范圍不僅使得它能被重用,而且可能更有用。這樣做不需要創建和維護多個類似視圖。

二、用視圖重新格式化檢索出的數據

如前所述,視圖的另一常見用途是重新格式化檢索出的數據。下面的 SELECT 語句 在單個組合計算列中返回供應商名和位置:

輸入▼

SELECT RTRIM(vend_name) + ' (' + RTRIM(vend_country) + ')'
       AS vend_title
FROM Vendors
ORDER BY vend_name;

輸出▼

vend_title
-----------------------------------------------------------
Bear Emporium (USA)
Bears R Us (USA)
Doll House Inc. (USA)
Fun and Games (England)
Furball Inc. (USA)
Jouets et ours (France)

下面是相同的語句,但使用了 || 語法(如 拼接字段 所述):

輸入▼

SELECT RTRIM(vend_name) || ' (' || RTRIM(vend_country) || ')'
       AS vend_title
FROM Vendors
ORDER BY vend_name;

輸出▼

vend_title
-----------------------------------------------------------
Bear Emporium (USA)
Bears R Us (USA)
Doll House Inc. (USA)
Fun and Games (England)
Furball Inc. (USA)
Jouets et ours (France)

現在,假設經常需要這個格式的結果。我們不必在每次需要時執行這種拼接,而是創建一個視圖,使用它即可。把此語句轉換為視圖,可按如下進行:

輸入▼

CREATE VIEW VendorLocations AS
SELECT RTRIM(vend_name) + ' (' + RTRIM(vend_country) + ')'
       AS vend_title
FROM Vendors;

下面是使用 || 語法的相同語句:

輸入▼

CREATE VIEW VendorLocations AS
SELECT RTRIM(vend_name) || ' (' || RTRIM(vend_country) || ')'
       AS vend_title
FROM Vendors;

分析▼

這條語句使用與以前 SELECT 語句相同的查詢創建視圖。要檢索數據,創建所有的郵件標簽,可如下進行:

輸入▼

SELECT * FROM VendorLocations;

輸出▼

vend_title
-----------------------------------------------------------
Bear Emporium (USA)
Bears R Us (USA)
Doll House Inc. (USA)
Fun and Games (England)
Furball Inc. (USA)
Jouets et ours (France)

說明:SELECT 約束全部適用

在這一部分的前面提到,各種 DBMS 中用來創建視圖的語法相當一致。那么,為什么會有多種創建視圖的語句版本呢?因為視圖只包含一個 SELECT 語句,而這個語句的語法必須遵循具體 DBMS 的所有規則和約束,所以會有多個創建視圖的語句版本。

三、用視圖過濾不想要的數據

視圖對於應用普通的 WHERE 子句也很有用。例如,可以定義 CustomerEMailList 視圖,過濾沒有電子郵件地址的顧客。為此,可使用下面的語句:

輸入▼

CREATE VIEW CustomerEMailList AS
SELECT cust_id, cust_name, cust_email
FROM Customers
WHERE cust_email IS NOT NULL;

分析▼

顯然,在將電子郵件發送到郵件列表時,需要排除沒有電子郵件地址的用戶。這里的 WHERE 子句過濾了 cust_email 列中具有 NULL 值的那些行,使它們不被檢索出來。

現在,可以像使用其他表一樣使用視圖 CustomerEMailList

輸入▼

SELECT *
FROM CustomerEMailList;

輸出▼

cust_id        cust_name        cust_email
----------     ------------     ---------------------
1000000001     Village Toys     sales@villagetoys.com
1000000003     Fun4All          jjones@fun4all.com
1000000004     Fun4All          dstephens@fun4all.com

說明:WHERE 子句與 WHERE 子句

從視圖檢索數據時如果使用了一條 WHERE 子句,則兩組子句(一組在視圖中,另一組是傳遞給視圖的)將自動組合。

四、使用視圖與計算字段

在簡化 計算字段 的使用上,視圖也特別有用。下面是 執行算術計算 中介紹的一條 SELECT 語句,它檢索某個訂單中的物品,計算每種物品的總價格:

輸入▼

SELECT prod_id,
       quantity,
       item_price,
       quantity*item_price AS expanded_price
FROM OrderItems
WHERE order_num = 20008;

輸出▼

prod_id      quantity      item_price      expanded_price
--------     ---------     -----------     --------------
RGAN01       5             4.9900          24.9500
BR03         5             11.9900         59.9500
BNBG01       10            3.4900          34.9000
BNBG02       10            3.4900          34.9000
BNBG03       10            3.4900          34.9000

要將其轉換為一個視圖,如下進行:

輸入▼

CREATE VIEW OrderItemsExpanded AS
SELECT order_num,
       prod_id,
       quantity,
       item_price,
       quantity*item_price AS expanded_price
FROM OrderItems

檢索訂單 20008 的詳細內容(上面的輸出),如下進行:

輸入▼

SELECT *
FROM OrderItemsExpanded
WHERE order_num = 20008;

輸出▼

order_num   prod_id   quantity    item_price    expanded_price
---------   -------   ---------   ----------    --------------
20008       RGAN01    5           4.99          24.95
20008       BR03      5           11.99         59.95
20008       BNBG01    10          3.49          34.90
20008       BNBG02    10          3.49          34.90
20008       BNBG03    10          3.49          34.90

可以看到,視圖非常容易創建,而且很好使用。正確使用,視圖可極大地簡化復雜數據的處理。

請參閱

(完)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM