明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

mysql高級(jí)聯(lián)結(jié)-自聯(lián)結(jié)使用案例

[摘要]自聯(lián)結(jié)如前所述,使用表別名的主要原因之一是能在單條 SELECT 語句中不止一次引用相同的表。下面舉一個(gè)例子。假如你發(fā)現(xiàn)某物品(其ID為 DTNTR )存在問題,因此想知道生產(chǎn)該物品的供應(yīng)商生產(chǎn)的其他物品是否也存在這些問題。此查詢要求首先找到生產(chǎn)ID為 DTNTR 的物品的供應(yīng)商,然后找出這個(gè)供應(yīng)...
自聯(lián)結(jié)

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

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

生產(chǎn)ID為 DTNTR 的物品的供應(yīng)商,然后找出這個(gè)供應(yīng)商生產(chǎn)的其他物品。

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

輸入:

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

輸出:

QQ截圖20170511093606.png

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

了一個(gè)簡單的檢索,返回生產(chǎn)ID為 DTNTR 的物品供應(yīng)商的vend_id 。該ID用于外部查詢的 WHERE 子句中,以便檢索出這個(gè)供應(yīng)商生

產(chǎn)的所有物品。

現(xiàn)在來看使用聯(lián)結(jié)的相同查詢:

輸入:

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';

輸出:

QQ截圖20170511093950.png

分析:此查詢中需要的兩個(gè)表實(shí)際上是相同的表,因此 products 表在FROM 子句中出現(xiàn)了兩次。雖然這是完全合法的,但對(duì) products的引用具有二義性,因?yàn)镸ySQL不知道你引用的是 products 表中的哪個(gè)實(shí)例。

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

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

以上就是mysql高級(jí)聯(lián)結(jié)-自聯(lián)結(jié)使用實(shí)例的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!


學(xué)習(xí)教程快速掌握從入門到精通的SQL知識(shí)。