跟我學(xué)SQL:(四)查詢多個(gè)表格

字號(hào):

在對(duì)跨多個(gè)表格的數(shù)據(jù)進(jìn)行組合時(shí),有時(shí)很難搞清楚要使用哪一個(gè)SQL句法。我將在這里對(duì)將多個(gè)表格中的查詢合并至單一聲明中的常用方式進(jìn)行闡述。
    在這篇文章中的樣本查詢符合SQL92 ISO標(biāo)準(zhǔn)。不是所有的數(shù)據(jù)庫(kù)生產(chǎn)商都遵循這項(xiàng)標(biāo)準(zhǔn),而且很多廠商采取的提升措施會(huì)帶來一些意料不到的后果。如果你不確定你的數(shù)據(jù)庫(kù)是不是支持這些標(biāo)準(zhǔn),你可以參看生產(chǎn)廠商的有關(guān)資料。
    SELECT
    一個(gè)簡(jiǎn)單的SELECT聲明就是查詢多個(gè)表格的最基本的方式。你可以在FROM子句中調(diào)用多個(gè)表格來組合來自多個(gè)表格的結(jié)果。這里是一個(gè)它如何工作的實(shí)例:
    SELECT table1.column1, table2.column2 FROM table1, table2 WHERE table1.column1 = table2.column1;
    這個(gè)實(shí)例中,我使用點(diǎn)號(hào)(table1.column1)來指定專欄來自哪一個(gè)表格。如果所涉及的專欄只在一個(gè)參考的表格中出現(xiàn),你就不需要加入完整的名稱,但是加入完整名稱會(huì)對(duì)可讀性起到幫助。
    在FROM子句中表格之間由逗號(hào)來分隔,你可以加入所需的任意多的表格,盡管一些數(shù)據(jù)庫(kù)有一個(gè)在引入正式的JOIN聲明之前他們可以有效地處理的內(nèi)容這方面的限制,這個(gè)將在下面談到。
    這個(gè)句法是一個(gè)簡(jiǎn)單的INNER JOIN。一些數(shù)據(jù)庫(kù)將它看成與一個(gè)外部的JOIN是等同的。WHERE子句告知數(shù)據(jù)庫(kù)哪一個(gè)區(qū)域要做關(guān)聯(lián),而且它返回結(jié)果時(shí),就像列出的表格在給定的條件下組合成一個(gè)單獨(dú)的表格一樣。值得注意的是,你的比較條件并不需要與你作為結(jié)果組返回的專欄相同。在上面的例子中,table1.column1和table2.column1用來組合表格,但是返回的卻是table2.column2。
    你可以在WHERE子句中使用AND關(guān)鍵字來將這個(gè)功能擴(kuò)展至多于兩個(gè)的表格。你還可以使用這樣的表格組合來限制你的結(jié)果而不用實(shí)際地從每個(gè)表格返回專欄。在下面的例子中,table3與table1匹配,但是我沒有從table3返回任何東西來顯示。我只是確保來自table1的有關(guān)專欄存在于table3之中。注意此例中table3需要在FROM子句中被引用。
    SELECT table1.column1, table2.column2 FROM table1, table2, table3 WHERE table1.column1 = table2.column1 AND table1.column1 = table3.column1;
    然而,要注意的是,這個(gè)查詢多個(gè)表格的方式是一個(gè)暗指的JOIN。你的數(shù)據(jù)庫(kù)可能對(duì)事物進(jìn)行不同的處理,這取決于它所使用的優(yōu)化引擎。而且,忽略對(duì)與WHERE子句的相關(guān)特性的定義將會(huì)給你帶來不愿看到的結(jié)果,例如從余下的查詢中返回與每一個(gè)可能的結(jié)果相關(guān)的專欄的rogue域,就像在CROSS JOIN之中一樣。
    如果你習(xí)慣于你的數(shù)據(jù)庫(kù)處理這種類型的聲明的方式,且你只對(duì)兩個(gè)或是少數(shù)幾個(gè)表格進(jìn)行組合,一個(gè)簡(jiǎn)單的SELECT聲明就可以達(dá)到目的。