mysql高級聯結-自聯結使用實例

自聯結

如前所述,使用表別名的主要原因之一是能在單條 select 語句中不止一次引用相同的表。下面舉一個例子。

假如你發現某物品(其ID為 DTNTR )存在問題,因此想知道生產該物品的供應商生產的其他物品是否也存在這些問題。此查詢要求首先找到

生產ID為 DTNTR 的物品的供應商,然后找出這個供應商生產的其他物品。

下面是解決此問題的一種方法:

輸入:

select?prod_id,prod_name?from?products?where?vend_id?=?(select?vend_id?from?products?where?prod_id?=?'DTNTR');

輸出:

mysql高級聯結-自聯結使用實例

分析:這是第一種解決方案,它使用了子查詢。內部的 SELECT 語句做

了一個簡單的檢索,返回生產ID為 DTNTR 的物品供應商的vend_id 。該ID用于外部查詢的 WHERE 子句中,以便檢索出這個供應商生

產的所有物品。

現在來看使用聯結的相同查詢:

輸入:

select?p1.prod_id,p1.prod_name?from?products?as?p1,products?as?p2?where?p1.vend_id?=?p2.vend_id?and?p2.prod_id?=?'DTNTR';

輸出:

mysql高級聯結-自聯結使用實例

分析:此查詢中需要的兩個表實際上是相同的表,因此 products 表在FROM 子句中出現了兩次。雖然這是完全合法的,但對 products的引用具有二義性,因為MySQL不知道你引用的是 products 表中的哪個實例。

為解決此問題,使用了表別名。 products 的第一次出現為別名 p1 ,第二次出現為別名 p2 。現在可以將這些別名用作表名。例如, SELECT 語句使用 p1 前綴明確地給出所需列的全名。如果不這樣,MySQL將返回錯誤,因為分別存在兩個名為 prod_id 、 prod_name 的列。MySQL不知道想要的是哪一個列(即使它們事實上是同一個列)。 WHERE (通過匹配 p1 中的 vend_id 和 p2 中的vend_id )首先聯結兩個表,然后按第二個表中的prod_id 過濾數據,返回所需的數據。

用自聯結而不用子查詢 自聯結通常作為外部語句用來替代從相同表中檢索數據時使用的子查詢語句。雖然最終的結果是相同的,但有時候處理聯結遠比處理子查詢快得多。應該試一下兩種方法,以確定哪一種的性能更好。

? 版權聲明
THE END
喜歡就支持一下吧
點贊9 分享