標籤:影響 支援 根據 pre 資源 一個 方法 欄位 標準
說明:使用互動式DBMS工具
重要的是,要理解連接不是物理實體。換句話說,它在實際的資料庫表中並不存在。DBMS會根據需要建立連接,它在查詢執行期間一直存
在。
一、等值文法:SELECT 欄位 FROM 表1,表2 WHERE 表1.欄位=表2.欄位
SELECT vend_name, prod_name, prod_priceFROM Vendors, ProductsWHERE Vendors.vend_id = Products.vend_id;
分析▼
我們來看這段代碼。SELECT語句與前面所有語句一樣指定要檢索的列。這裡最大的差別是所指定的兩列(prod_name和prod_price)在一個表
中,而第三列(vend_name)在另一個表中。
現在來看FROM子句。與以前的SELECT語句不一樣,這條語句的FROM子句列出了兩個表:Vendors和Products。它們就是這條SELECT語句連接
的兩個表的名字。這兩個表用WHERE子句正確地連接,WHERE子句指示DBMS將Vendors表中的vend_id與Products表中的vend_id匹配起來。
可以看到,要匹配的兩列指定為Vendors.vend_id和Products.vend_id。這裡需要這種完全限定列名,如果只給出vend_id,DBMS就不知道指的
是哪一個(每個表中有一個)。從前面的輸出可以看到,一條SELECT語句返回了兩個不同表中的資料。
警告:完全限定列名(用表名點出列)
就像前一課提到的,在引用的列可能出現歧義時,必須使用完全限定列名(用一個句點分隔表名和列名)。如果引用一個沒有用表名限制的
具有歧義的列名,大多數DBMS會返回錯誤
警告:不要忘了WHERE子句
要保證所有連接都有WHERE子句,否則DBMS將返回比想要的資料多得多的資料。同理,要保證WHERE子句的正確性。不正確的過濾條件
會導致DBMS返回不正確的資料
笛卡兒積(cartesian product)
由沒有連接條件的表關係返回的結果為笛卡兒積。檢索出的行的數目將是第一個表中的行數乘以第二個表中的行數。
提示:叉連接
有時,返回笛卡兒積的連接,也稱叉連接(cross join)。
二.內連接:SELECT 欄位 FROM 表1 INNER JOIN 表2 ON 表1.欄位=表2.欄位
目前為止使用的連接稱為等值連接(equijoin),它基於兩個表之間的相等測試。這種連接也稱為內連接(inner join)。其實,可以對這種連接
使用稍微不同的文法,明確指定連接的類型。
SELECT vend_name, prod_name, prod_priceFROM Vendors INNER JOIN ProductsON Vendors.vend_id = Products.vend_id;
分析▼
此語句中的SELECT與前面的SELECT語句相同,但FROM子句不同。這裡,兩個表之間的關係是以INNER JOIN指定的部分FROM子句。在使用
這種文法時,連接條件用特定的ON子句而不是WHERE子句給出。傳遞給ON的實際條件與傳遞給WHERE的相同。
說明:“正確的”文法
ANSI SQL規範首選INNER JOIN文法,之前使用的是簡單的等值文法。其實,SQL語言純正論者是用鄙視的眼光看待簡單文法的。這就是
說,DBMS的確支援簡單格式和標準格式,我建議你要理解這兩種格式,具體使用就看你用哪個更順手了。
三、連接多個表
SQL不限制一條SELECT語句中可以連接的表的數目。建立連接的基本規則也相同。首先列出所有表,然後定義表之間的關係。
SELECT prod_name, vend_name, prod_price, quantityFROM OrderItems, Products, VendorsWHERE Products.vend_id = Vendors.vend_idAND OrderItems.prod_id = Products.prod_idAND order_num = 20007;
警告:效能考慮
DBMS在運行時關聯指定的每個表,以處理連接。這種處理可能非常耗費資源,因此應該注意,不要連接不必要的表。連接的表越多,效能
下降越厲害。
警告:連接中表的最大數目
雖然SQL本身不限制每個連接約束中表的數目,但實際上許多DBMS都有限制。請參閱具體的DBMS文檔以瞭解其限制。
提示:多做實驗
可以看到,執行任一給定的SQL操作一般不止一種方法。很少有絕對正確或絕對錯誤的方法。效能可能會受操作類型、所使用的DBMS、表
中資料量、是否存在索引或鍵等條件的影響。因此,有必要實驗不同的選擇機制,找出最適合具體情況的方法。
11.連接表---SQL