mysql高級聯(lián)結-自聯(lián)結使用案例
發(fā)表時間:2023-08-31 來源:明輝站整理相關軟件相關文章人氣:
[摘要]自聯(lián)結如前所述,使用表別名的主要原因之一是能在單條 SELECT 語句中不止一次引用相同的表。下面舉一個例子。假如你發(fā)現(xiàn)某物品(其ID為 DTNTR )存在問題,因此想知道生產該物品的供應商生產的其他物品是否也存在這些問題。此查詢要求首先找到生產ID為 DTNTR 的物品的供應商,然后找出這個供應...
自聯(lián)結如前所述,使用表別名的主要原因之一是能在單條 SELECT 語句中不止一次引用相同的表。下面舉一個例子。
假如你發(fā)現(xiàn)某物品(其ID為 DTNTR )存在問題,因此想知道生產該物品的供應商生產的其他物品是否也存在這些問題。此查詢要求首先找到
生產ID為 DTNTR 的物品的供應商,然后找出這個供應商生產的其他物品。
下面是解決此問題的一種方法:
輸入:
select prod_id,prod_name from products where vend_id = (select vend_id from products where prod_id = 'DTNTR');
輸出:

分析:這是第一種解決方案,它使用了子查詢。內部的 SELECT 語句做
了一個簡單的檢索,返回生產ID為 DTNTR 的物品供應商的vend_id 。該ID用于外部查詢的 WHERE 子句中,以便檢索出這個供應商生
產的所有物品。
現(xiàn)在來看使用聯(lián)結的相同查詢:
輸入:
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';
輸出:

分析:此查詢中需要的兩個表實際上是相同的表,因此 products 表在FROM 子句中出現(xiàn)了兩次。雖然這是完全合法的,但對 products的引用具有二義性,因為MySQL不知道你引用的是 products 表中的哪個實例。
為解決此問題,使用了表別名。 products 的第一次出現(xiàn)為別名 p1 ,第二次出現(xiàn)為別名 p2 。現(xiàn)在可以將這些別名用作表名。例如, SELECT 語句使用 p1 前綴明確地給出所需列的全名。如果不這樣,MySQL將返回錯誤,因為分別存在兩個名為 prod_id 、 prod_name 的列。MySQL不知道想要的是哪一個列(即使它們事實上是同一個列)。 WHERE (通過匹配 p1 中的 vend_id 和 p2 中的vend_id )首先聯(lián)結兩個表,然后按第二個表中的prod_id 過濾數(shù)據(jù),返回所需的數(shù)據(jù)。
用自聯(lián)結而不用子查詢 自聯(lián)結通常作為外部語句用來替代從相同表中檢索數(shù)據(jù)時使用的子查詢語句。雖然最終的結果是相同的,但有時候處理聯(lián)結遠比處理子查詢快得多。應該試一下兩種方法,以確定哪一種的性能更好。
以上就是mysql高級聯(lián)結-自聯(lián)結使用實例的詳細內容,更多請關注php中文網(wǎng)其它相關文章!
學習教程快速掌握從入門到精通的SQL知識。