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

MySQL中如何用WHERE子句聯(lián)結(jié)多個(gè)表

[摘要]WHERE子句的重要性利用 WHERE 子句建立聯(lián)結(jié)關(guān)系似乎有點(diǎn)奇怪,但實(shí)際上,有一個(gè)很充分的理由。請(qǐng)記住,在一條 SELECT 語(yǔ)句中聯(lián)結(jié)幾個(gè)表時(shí),相應(yīng)的關(guān)系是在運(yùn)行中構(gòu)造的。在數(shù)據(jù)庫(kù)表的定義中不存在能指示MySQL如何對(duì)表進(jìn)行聯(lián)結(jié)的東西。你必須自己做這件事情。在聯(lián)結(jié)兩個(gè)表時(shí),你實(shí)際上做的是將第...
WHERE子句的重要性

利用 WHERE 子句建立聯(lián)結(jié)關(guān)系似乎有點(diǎn)奇怪,但實(shí)際上,有一個(gè)很充分的理由。請(qǐng)記住,在一條 SELECT 語(yǔ)句中聯(lián)結(jié)幾個(gè)表時(shí),相應(yīng)的關(guān)系是在運(yùn)行中構(gòu)造的。在數(shù)據(jù)庫(kù)表的定義中不存在能指示MySQL如何對(duì)表進(jìn)行聯(lián)結(jié)的東西。你必須自己做這件事情。在聯(lián)結(jié)兩個(gè)表時(shí),你實(shí)際上做的是將第一個(gè)表中的每一行與第二個(gè)表中的每一行配對(duì)。 WHERE 子句作為過(guò)濾條件,它只包含那些匹配給定條件(這里是聯(lián)結(jié)條件)的行。沒(méi)有WHERE 子句,第一個(gè)表中的每個(gè)行將與第二個(gè)表中的每個(gè)行配對(duì),而不管它們邏輯上是否可以配在一起。

笛卡兒積(cartesian product) 由沒(méi)有聯(lián)結(jié)條件的表關(guān)系返回的結(jié)果為笛卡兒積。檢索出的行的數(shù)目將是第一個(gè)表中的行數(shù)乘以第二個(gè)表中的行數(shù)。

輸入:

select vend_name,prod_name,prod_price from vendors,products order by vend_name,prod_name;

分析:相應(yīng)的笛卡兒積不是我們所想要的。這里返回的數(shù)據(jù)用每個(gè)供應(yīng)商匹配了每個(gè)產(chǎn)品,它包括了

供應(yīng)商不正確的產(chǎn)品。實(shí)際上有的供應(yīng)商根本就沒(méi)有產(chǎn)品。

不要忘了 WHERE 子句 應(yīng)該保證所有聯(lián)結(jié)都有 WHERE 子句,否則MySQL將返回比想要的數(shù)據(jù)多得多的數(shù)據(jù)。同理,應(yīng)該保證 WHERE 子句的正確性。不正確的過(guò)濾條件將導(dǎo)致MySQL返回不正確的數(shù)據(jù)。

叉聯(lián)結(jié) 有時(shí)我們會(huì)聽(tīng)到返回稱(chēng)為叉聯(lián)結(jié)(cross join)的笛卡兒積的聯(lián)結(jié)類(lèi)型。

內(nèi)部聯(lián)結(jié)

目前為止所用的聯(lián)結(jié)稱(chēng)為等值聯(lián)結(jié)(equijoin),它基于兩個(gè)表之間的相等測(cè)試。這種聯(lián)結(jié)也稱(chēng)為內(nèi)部聯(lián)結(jié)。其實(shí),對(duì)于這種聯(lián)結(jié)可以使用稍微不同的語(yǔ)法來(lái)明確指定聯(lián)結(jié)的類(lèi)型。下面的 SELECT 語(yǔ)句返回與前面例子完全相同的數(shù)據(jù):

輸入:

select vend_name,prod_name,prod_price from vendors inner join products on vendors.vend_id = products.vend_id;

分析:此語(yǔ)句中的 SELECT 與前面的 SELECT 語(yǔ)句相同,但 FROM 子句不同。這里,兩個(gè)表之間的關(guān)系是 FROM 子句的組成部分,以 INNERJOIN 指定。在使用這種語(yǔ)法時(shí),聯(lián)結(jié)條件用特定的 ON 子句而不是 WHERE子句給出。傳遞給 ON 的實(shí)際條件與傳遞給 WHERE 的相同。

使用哪種語(yǔ)法 ANSI SQL規(guī)范首選 INNER JOIN 語(yǔ)法。此外,盡管使用 WHERE 子句定義聯(lián)結(jié)的確比較簡(jiǎn)單,但是使用明確的聯(lián)結(jié)語(yǔ)法能夠確保不會(huì)忘記聯(lián)結(jié)條件,有時(shí)候這樣做也能影響性能。


聯(lián)結(jié)多個(gè)表

SQL對(duì)一條 SELECT 語(yǔ)句中可以聯(lián)結(jié)的表的數(shù)目沒(méi)有限制。創(chuàng)建聯(lián)結(jié)的基本規(guī)則也相同。首先列出所有表,然后定義表之間的關(guān)系。例如:

輸入:

select prod_name,vend_name,prod_price,quantity from orderitems,products,vendors where products.vend_id = vendors.vend_id and orderitems.prod_id = products.products.prod_id and order_num = 20005;

輸出:

QQ截圖20170510112423.png

分析:此例子顯示編號(hào)為 20005 的訂單中的物品。訂單物品存儲(chǔ)在orderitems 表中。每個(gè)產(chǎn)品按其產(chǎn)品ID存儲(chǔ),它引用 products表中的產(chǎn)品。這些產(chǎn)品通過(guò)供應(yīng)商ID聯(lián)結(jié)到 vendors 表中相應(yīng)的供應(yīng)商,供應(yīng)商ID存儲(chǔ)在每個(gè)產(chǎn)品的記錄中。這里的 FROM 子句列出了3個(gè)表,而WHERE 子句定義了這兩個(gè)聯(lián)結(jié)條件,而第三個(gè)聯(lián)結(jié)條件用來(lái)過(guò)濾出訂單20005 中的物品。

性能考慮 MySQL在運(yùn)行時(shí)關(guān)聯(lián)指定的每個(gè)表以處理聯(lián)結(jié)。這種處理可能是非常耗費(fèi)資源的,因此應(yīng)該仔細(xì),不要聯(lián)結(jié)不必要的表。聯(lián)結(jié)的表越多,性能下降越厲害。

多做實(shí)驗(yàn) 正如所見(jiàn),為執(zhí)行任一給定的SQL操作,一般存在不止一種方法。很少有絕對(duì)正確或絕對(duì)錯(cuò)誤的方法。性能可能會(huì)受操作類(lèi)型、表中數(shù)據(jù)量、是否存在索引或鍵以及其他一些條件的影響。因此,有必要對(duì)不同的選擇機(jī)制進(jìn)行實(shí)驗(yàn),以找出最適合具體情況的方法。

【相關(guān)推薦】

1.什么是mysql子查詢(xún)?如何利用子查詢(xún)進(jìn)行過(guò)濾?

2.mysql創(chuàng)建計(jì)算字段使用子查詢(xún)

3.mysql中什么是聯(lián)結(jié)和關(guān)系表?

4.為什么使用聯(lián)結(jié)和如何創(chuàng)建聯(lián)結(jié)

以上就是MySQL中如何用WHERE子句聯(lián)結(jié)多個(gè)表的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!


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