對(duì)于多個(gè)相似的選擇查詢,當(dāng)您希望將它們返回的所有數(shù)據(jù)一起作為一個(gè)合并的集合查看時(shí),便可以使用聯(lián)合查詢。
本文將向您介紹如何根據(jù)兩個(gè)或多個(gè)現(xiàn)有的選擇查詢創(chuàng)建聯(lián)合查詢,同時(shí)說明如何使用結(jié)構(gòu)化查詢語言 (SQL) 編寫聯(lián)合查詢。
請(qǐng)參閱
為完成本文中的示例,您應(yīng)該對(duì)如何創(chuàng)建和運(yùn)行選擇查詢有基本的了解。有關(guān)如何創(chuàng)建選擇查詢的詳細(xì)信息,請(qǐng)參閱部分中的鏈接。
本文內(nèi)容
聯(lián)合查詢基礎(chǔ)知識(shí)
聯(lián)合查詢有哪些功能?
聯(lián)合查詢可合并多個(gè)相似的選擇查詢的結(jié)果集。
例如,假設(shè)您有兩個(gè)表,一個(gè)用于存儲(chǔ)有關(guān)客戶的信息,另一個(gè)用于存儲(chǔ)有關(guān)供應(yīng)商的信息,并且這兩個(gè)表之間不存在任何關(guān)系。又假設(shè)這兩個(gè)表都有一些存儲(chǔ)聯(lián)系人信息的字段,而您希望同時(shí)查看這兩個(gè)表中的所有聯(lián)系人信息。
您可以為每個(gè)表都創(chuàng)建一個(gè)選擇查詢(選擇查詢:就表中存儲(chǔ)的數(shù)據(jù)提出問題,然后在不更改數(shù)據(jù)的情況下以數(shù)據(jù)表的形式返回一個(gè)結(jié)果集。),以便只檢索包含聯(lián)系人信息的那些字段,但返回的信息仍將位于兩個(gè)單獨(dú)的位置。要將兩個(gè)或多個(gè)選擇查詢的結(jié)果合并到一個(gè)結(jié)果集中,可以使用聯(lián)合查詢。
聯(lián)合查詢的要求
聯(lián)合查詢中合并的選擇查詢必須具有相同的輸出字段數(shù)、采用相同的順序并包含相同或兼容的數(shù)據(jù)類型。在運(yùn)行聯(lián)合查詢時(shí),來自每組相應(yīng)字段中的數(shù)據(jù)將合并到一個(gè)輸出字段中,這樣查詢輸出所包含的字段數(shù)將與每個(gè) Select 語句相同。
注釋
根據(jù)聯(lián)合查詢的目的,“數(shù)字”和“文本”數(shù)據(jù)類型兼容。
“SQL 視圖”
聯(lián)合查詢是特定于 SQL 的。特定于 SQL 的查詢不能在“設(shè)計(jì)”視圖中顯示,因此必須直接用 SQL 編寫。在 MicrosoftofficeAccess2007 中,您可以使用對(duì)象選項(xiàng)卡編寫特定于 SQL 的查詢,包括聯(lián)合查詢。
提示
每個(gè)查詢都可以用 SQL 語句來表達(dá)。此外,大多數(shù)查詢也可以在查詢?cè)O(shè)計(jì)網(wǎng)格(設(shè)計(jì)網(wǎng)格:在查詢?cè)O(shè)計(jì)視圖或“高級(jí)篩選/排序”窗口中設(shè)計(jì)查詢或篩選時(shí)所用的網(wǎng)格。對(duì)于查詢,該網(wǎng)格以前稱為“QBE 網(wǎng)格”。)中表達(dá),如果此環(huán)境可用,構(gòu)建查詢將更加輕松。在使用設(shè)計(jì)網(wǎng)格創(chuàng)建查詢時(shí),您始終都可以切換到 SQL 視圖,以查看運(yùn)行查詢時(shí)所處理的 SQL 語句。在 SQL 視圖中查看查詢是一種很好的做法,因?yàn)槟梢酝ㄟ^此途徑熟悉 SQL 并加深對(duì)查詢工作方式的理解。在某些情況下,您還可以使用 SQL 視圖對(duì)未返回預(yù)期結(jié)果的查詢進(jìn)行故障排除。
聯(lián)合查詢的 SQL 語法
在聯(lián)合查詢中,每個(gè)選擇查詢(又稱為 Select 語句)都有一個(gè) SELECT 子句和 FROM 子句,還可能有 WHERE 子句。SELECT 子句列出包含要檢索的數(shù)據(jù)的字段;FROM 子句列出包含這些字段的表;WHERE 子句則列出這些字段的條件。聯(lián)合查詢中的 Select 語句用 UNION 關(guān)鍵字組合在一起。
對(duì)于合并了兩個(gè)選擇查詢的聯(lián)合查詢,其基本 SQL 語法如下:
SELECT field_1[, field_2,…] FROM table_1[, table_2,…] UNION [ALL] SELECT field_a[, field_b,...] FROM table_a[, table_b,…];
例如,假設(shè)您有兩個(gè)表,分別名為 Products 和 Services。這兩個(gè)表都具有包含下列內(nèi)容的字段:產(chǎn)品或服務(wù)的名稱、價(jià)格、保修或擔(dān)保條款以及是否以獨(dú)占方式提供產(chǎn)品或服務(wù)。雖然 Products 表存儲(chǔ)了保修信息,而 Services 表存儲(chǔ)了擔(dān)保信息,但基本信息是相同的(即特定的產(chǎn)品或服務(wù)是否符合其質(zhì)量承諾)。您可以使用聯(lián)合查詢將兩個(gè)表中的這四個(gè)字段合并在一起,例如:
SELECT name, price, warranty_available, exclusive_offer FROM Products UNION ALL SELECT name, price, guarantee_available, exclusive_offer FROM Services;
讓我們逐行檢查上面的語法示例。
SELECT name, price, warranty_available, exclusive_offer
這是一個(gè) SELECT 子句,用于引入選擇查詢。SELECT 后面跟有一個(gè)標(biāo)識(shí)符列表,用于指示要從中檢索數(shù)據(jù)的字段。SELECT 子句必須始終至少列出一個(gè)字段。此 SELECT 子句列出了字段標(biāo)識(shí)符、、和。
FROM Products
這是一個(gè) FROM 子句。FROM 子句跟在 SELECT 子句之后,二者共同構(gòu)成了一個(gè)基本的 Select 語句。FROM 后也跟有一個(gè)標(biāo)識(shí)符列表,用于指示哪些表包含 SELECT 子句中列出的字段。FROM 子句必須始終至少列出一個(gè)表。此 FROM 子句列出了表標(biāo)識(shí)符。
UNION ALL
這是一個(gè) UNION 關(guān)鍵字以及一個(gè)可選的 ALL 關(guān)鍵字。UNION 指示將 UNION 前后的 SELECT 語句的結(jié)果合并在一起。
在使用 ALL 關(guān)鍵字時(shí),Union 生成的合并集中并不刪除重復(fù)行。這樣,Access 便無需檢查重復(fù)行的結(jié)果,從而可以顯著提高查詢的性能。如果滿足下列任一條件,則應(yīng)使用 ALL 關(guān)鍵字:
您確定選擇查詢不會(huì)生成任何重復(fù)行。
結(jié)果中是否存在重復(fù)行無關(guān)緊要。
您希望查看重復(fù)行。
在本示例中,我們使用 ALL 關(guān)鍵字是因?yàn)槲覀兗炔黄谕麜?huì)返回重復(fù)行,也沒有略去它們的必要。
SELECT name, price, guarantee_available, exclusive_offer
這是第二個(gè) SELECT 子句,用于引入聯(lián)合查詢中的第二個(gè) SELECT 語句。在編寫聯(lián)合查詢時(shí),各個(gè) SELECT 語句中的字段必須相互對(duì)應(yīng),這意味著各個(gè) SELECT 語句必須具有相同的字段數(shù),并且共享通用數(shù)據(jù)的字段必須以相同的順序出現(xiàn)在子句中,同時(shí)這些字段必須具有相同或兼容的數(shù)據(jù)類型,如示例中所示。只有這些字段相互對(duì)應(yīng),才能在查詢輸出中將它們合并在一起。
注釋
聯(lián)合查詢輸出中的字段名稱從第一個(gè) SELECT 子句中提取。因此,在本示例的查詢輸出中,來自字段“warranty_available”和“guarantee_available”的數(shù)據(jù)將被命名為“warranty_available”。
FROM Services
這是第二個(gè) FROM 子句,用于完成聯(lián)合查詢中的第二個(gè) SELECT 語句。與 SELECT 子句中的字段不同,聯(lián)合查詢對(duì) FROM 子句沒有表限制。您既可以創(chuàng)建在每個(gè) FROM 子句中都使用相同的表的聯(lián)合查詢,也可以在 FROM 子句中使用不同數(shù)目的表。在我們的示例中,每個(gè) FROM 子句都只有一個(gè)表。
創(chuàng)建聯(lián)合查詢
創(chuàng)建聯(lián)合查詢有兩種基本方法:
先在查詢“設(shè)計(jì)”視圖(設(shè)計(jì)視圖:顯示數(shù)據(jù)庫(kù)對(duì)象(包括:表、查詢、窗體、宏和數(shù)據(jù)訪問頁)的設(shè)計(jì)的窗口。在設(shè)計(jì)視圖中,可以新建數(shù)據(jù)庫(kù)對(duì)象和修改現(xiàn)有數(shù)據(jù)庫(kù)對(duì)象的設(shè)計(jì)。)中創(chuàng)建各個(gè)組件選擇查詢,然后將這些查詢合并為一個(gè)聯(lián)合查詢。
直接在 SQL 視圖(SQL 視圖:用于顯示當(dāng)前查詢的 SQL 語句或用于創(chuàng)建 SQL 特有查詢(聯(lián)合查詢、傳遞查詢或數(shù)據(jù)定義查詢)的窗口。在設(shè)計(jì)視圖中創(chuàng)建查詢時(shí),Access 會(huì)在 SQL 視圖中構(gòu)建 SQL 的等價(jià)查詢。)中創(chuàng)建整個(gè)聯(lián)合查詢。
在大多數(shù)情況下,您都應(yīng)該先創(chuàng)建選擇查詢,然后再將它們合并為一個(gè)聯(lián)合查詢。在 Office Access 2007 中,“設(shè)計(jì)”視圖提供了一種易用的創(chuàng)建選擇查詢的圖形用戶界面,您可以復(fù)制這些查詢的 SQL 語句并將它們粘貼到聯(lián)合查詢中。
但是,如果您認(rèn)為編寫 SQL 語句得心應(yīng)手,或者希望獲得更多的 SQL 編寫體驗(yàn),則可能更傾向于直接在 SQL 視圖中創(chuàng)建聯(lián)合查詢。
先在“設(shè)計(jì)”視圖中創(chuàng)建選擇查詢,然后合并它們
按照此方法,將先使用“設(shè)計(jì)”視圖創(chuàng)建每個(gè)選擇查詢,然后使用 SQL 視圖合并選擇查詢。
在“設(shè)計(jì)”視圖中創(chuàng)建每個(gè)選擇查詢
“創(chuàng)建”
在選項(xiàng)卡上的組中,單擊。
“顯示表”
在對(duì)話框中,雙擊要包括的字段所在的表。
這會(huì)將該表添加到查詢?cè)O(shè)計(jì)窗口。
注釋
雖然您可以在選擇查詢中包括多個(gè)表或查詢,但此過程假定每個(gè)選擇查詢只包括一個(gè)表中的數(shù)據(jù)。
“顯示表”
關(guān)閉對(duì)話框。
在查詢?cè)O(shè)計(jì)窗口中,雙擊要包括的每個(gè)字段。
選擇字段時(shí),請(qǐng)確保您在其他選擇查詢中以相同順序添加了相同數(shù)目的字段。另外,請(qǐng)注意各個(gè)字段的數(shù)據(jù)類型,確保在要合并的其他查詢中,處于相應(yīng)位置的字段具有兼容的數(shù)據(jù)類型。
例如,如果第一個(gè)選擇查詢具有五個(gè)字段,且第一個(gè)字段包含“日期/時(shí)間”數(shù)據(jù),請(qǐng)確保要合并的其他每個(gè)選擇查詢也具有五個(gè)字段,并且第一個(gè)字段同樣包含“日期/時(shí)間”數(shù)據(jù),依此類推。
“條件”
另外,您還可以在字段網(wǎng)格的行中鍵入適當(dāng)?shù)谋磉_(dá)式(表達(dá)式:算術(shù)或邏輯運(yùn)算符、常數(shù)、函數(shù)和字段名稱、控件和屬性的任意組合,計(jì)算結(jié)果為單個(gè)值。表達(dá)式可執(zhí)行計(jì)算、操作字符或測(cè)試數(shù)據(jù)。),以此向字段中添加條件。
在添加完字段和字段條件后,應(yīng)運(yùn)行選擇查詢并查看其輸出。
“設(shè)計(jì)”
在選項(xiàng)卡上的組中,單擊。
將查詢切換到“設(shè)計(jì)”視圖。
保存該選擇查詢,但不要將其關(guān)閉。
對(duì)于要合并的每個(gè)選擇查詢,請(qǐng)重復(fù)此過程。
在 SQL 視圖中合并選擇查詢
“創(chuàng)建”
在選項(xiàng)卡上的組中,單擊。
在“設(shè)計(jì)”視圖中打開一個(gè)新查詢。
“顯示表”
關(guān)閉對(duì)話框。
“設(shè)計(jì)”
在選項(xiàng)卡上的組中,單擊。
將隱藏查詢?cè)O(shè)計(jì)窗口,并顯示 SQL 視圖對(duì)象選項(xiàng)卡。此時(shí),SQL 視圖對(duì)象選項(xiàng)卡中沒有任何內(nèi)容。
單擊要合并在聯(lián)合查詢中的第一個(gè)選擇查詢的選項(xiàng)卡。
“開始”
在選項(xiàng)卡上的組中,單擊,然后單擊。
將顯示該選擇查詢的 SQL 語句。
復(fù)制該選擇查詢的 SQL 語句。
單擊此過程在步驟 1 中開始創(chuàng)建的聯(lián)合查詢的選項(xiàng)卡。
將選擇查詢的 SQL 語句粘貼到聯(lián)合查詢的 SQL 視圖對(duì)象選項(xiàng)卡中。
刪除選擇查詢 SQL 語句末尾的分號(hào) (;)。
UNION
按 Enter 將光標(biāo)移到下一行,然后在新行中鍵入。
您也可以再在其后鍵入一個(gè)空格,跟著鍵入 ALL 關(guān)鍵字,然后再次按 Enter。
單擊要合并到聯(lián)合查詢中的下一個(gè)選擇查詢的選項(xiàng)卡。
請(qǐng)重復(fù)此過程的步驟 5 到步驟 11,直至將選擇查詢的所有 SQL 語句都通過復(fù)制和粘貼的方式添加到聯(lián)合查詢的 SQL 視圖窗口中。對(duì)于最后一個(gè)選擇查詢的 SQL 語句,請(qǐng)勿刪除其分號(hào)或鍵入任何內(nèi)容。
“設(shè)計(jì)”
在選項(xiàng)卡上的組中,單擊。
聯(lián)合查詢的結(jié)果將顯示在“數(shù)據(jù)表”視圖(數(shù)據(jù)表視圖:以行列格式顯示來自表、窗體、查詢、視圖或存儲(chǔ)過程的窗口。在數(shù)據(jù)表視圖中,可以編輯字段、添加和刪除數(shù)據(jù),以及搜索數(shù)據(jù)。)中。
直接在 SQL 視圖中創(chuàng)建聯(lián)合查詢
以下過程將引導(dǎo)您完成在 SQL 視圖中創(chuàng)建基本聯(lián)合查詢的步驟。
“創(chuàng)建”
在選項(xiàng)卡上的組中,單擊。
在“設(shè)計(jì)”視圖中打開一個(gè)新查詢。
“顯示表”
關(guān)閉對(duì)話框。
“設(shè)計(jì)”
在選項(xiàng)卡上的組中,單擊。
將隱藏查詢?cè)O(shè)計(jì)窗口,并顯示 SQL 視圖對(duì)象選項(xiàng)卡。此時(shí),SQL 視圖對(duì)象選項(xiàng)卡中沒有任何內(nèi)容。
“SQL 視圖”
在對(duì)象選項(xiàng)卡中,鍵入,然后鍵入要包括在查詢中的第一個(gè)或第一組表中的字段列表。請(qǐng)使用逗號(hào)將各個(gè)字段名稱隔開。在鍵入完字段名稱的列表后,請(qǐng)按 Enter。
FROM
鍵入,跟著鍵入包含上一個(gè) SELECT 子句所列字段的表的名稱,然后按 Enter。
WHERE
要為其中某個(gè)表中的字段指定條件,請(qǐng)鍵入,跟著鍵入字段名稱、比較運(yùn)算符(通常為等號(hào))和條件。您還可以使用 AND 和 OR 關(guān)鍵字在 WHERE 子句的末尾添加其他條件。指定條件后,請(qǐng)按 Enter。
UNION
鍵入。如果您不希望查詢?cè)谳敵鲋袆h除重復(fù)行,請(qǐng)鍵入一個(gè)空格,跟著鍵入 ALL 關(guān)鍵字,然后按 Enter。
SELECT
鍵入,跟著鍵入要包括在查詢中的下一個(gè)或下一組表中的字段列表。這些字段必須與第一個(gè) SELECT 子句中包含的字段相對(duì)應(yīng)且順序相同。請(qǐng)使用逗號(hào)將各個(gè)字段名稱隔開。在鍵入完字段名稱后,請(qǐng)按 Enter。
FROM
鍵入,跟著鍵入要包括在查詢中的下一個(gè)或下一組表的名稱,然后按 Enter。
WHERE
要為其中某個(gè)表中的字段指定條件,請(qǐng)鍵入,跟著鍵入字段名稱、比較運(yùn)算符(通常為等號(hào))和條件。您還可以使用 AND 關(guān)鍵字在 WHERE 子句的末尾添加其他條件。指定條件后,請(qǐng)按 Enter。
要在聯(lián)合查詢中包括其他 Select 語句,請(qǐng)重復(fù)步驟 7 到步驟 10。
;
請(qǐng)鍵入指示查詢的末尾。
“設(shè)計(jì)”
在選項(xiàng)卡上的組中,單擊。
聯(lián)合查詢的結(jié)果將顯示在“數(shù)據(jù)表”視圖(數(shù)據(jù)表視圖:以行列格式顯示來自表、窗體、查詢、視圖或存儲(chǔ)過程的窗口。在數(shù)據(jù)表視圖中,可以編輯字段、添加和刪除數(shù)據(jù),以及搜索數(shù)據(jù)。)中。
使用聯(lián)合查詢的提示
如果您希望能夠辨別各個(gè)行分別來自哪個(gè)表,可以在每個(gè) Select 語句中添加一個(gè)文本字符串并將其用作一個(gè)字段。例如,如果有兩個(gè) Select 語句,一個(gè)要檢索 Products 表中的字段,另一個(gè)則要檢索 Services 表中的字段,您可以在第一個(gè)語句的末尾將字符串“Product”添加為字段,而在第二個(gè)語句的末尾將“Service”添加為字段。此外,您還可以使用 AS 關(guān)鍵字向這些字符串分配字段別名(例如“type”),如下面的示例中所示:
SELECT field1, field2, ... "Product" AS type
SELECT field1, field2, ... "Service" AS type
該查詢的輸出將包括一個(gè)名為“type”的字段,其中會(huì)顯示各個(gè)行是來自 Products 表,還是來自 Services 表。
每個(gè) UNION 關(guān)鍵字將合并緊跟在它前面和后面的 SELECT 語句。如果您只在查詢的部分 Union 關(guān)鍵字后使用了 ALL 關(guān)鍵字,則結(jié)果將包括由 UNION ALL 合并的 SELECT 語句對(duì)中的重復(fù)行,但不包括只用 UNION 而不用 ALL 關(guān)鍵字合并的 SELECT 語句中的重復(fù)行。
Right
對(duì)于要合并在聯(lián)合查詢中的選擇查詢,雖然其字段的數(shù)目、數(shù)據(jù)類型和順序都必須相對(duì)應(yīng),但如果出現(xiàn)不對(duì)應(yīng)的情況,您也可以使用表達(dá)式(例如計(jì)算或子查詢)讓它們對(duì)應(yīng)起來。例如,您可以讓兩個(gè)字符的年字段與四個(gè)字符的年字段匹配,方法是使用函數(shù)提取四個(gè)字符的年的后兩位數(shù)字。
如果要使用某個(gè)聯(lián)合查詢的輸出創(chuàng)建一個(gè)新表,可以將該聯(lián)合查詢用作一個(gè)新選擇查詢的輸入,然后再將該選擇查詢用作生成表查詢(生成表查詢:一種查詢(SQL 語句),它創(chuàng)建一個(gè)新表,然后通過從一個(gè)現(xiàn)有表中復(fù)制記錄,在新表中創(chuàng)建記錄(行)。)的基礎(chǔ):
創(chuàng)建并保存該聯(lián)合查詢。
“創(chuàng)建”
在選項(xiàng)卡上的組中,單擊。
“顯示表”
在對(duì)話框中,單擊選項(xiàng)卡。
“顯示表”
雙擊該聯(lián)合查詢,然后關(guān)閉對(duì)話框。
注釋
如果消息欄中顯示了安全警告,則說明可能禁用了生成表查詢等動(dòng)作查詢。要允許動(dòng)作查詢運(yùn)行,請(qǐng)單擊消息欄上的,然后在中單擊。
在查詢?cè)O(shè)計(jì)網(wǎng)格中,雙擊聯(lián)合查詢對(duì)象選項(xiàng)卡上的星號(hào) (*),以使用聯(lián)合查詢的所有字段創(chuàng)建新表。
-或-
雙擊要在新表中使用的每個(gè)字段。
“設(shè)計(jì)”
在選項(xiàng)卡上的組中,單擊。
“生成表”
在對(duì)話框中,為新表鍵入一個(gè)名稱。您還可以指定另一個(gè)數(shù)據(jù)庫(kù)來創(chuàng)建新表。完成后請(qǐng)單擊。
“設(shè)計(jì)”
在選項(xiàng)卡上的組中,單擊。
您可以使用聯(lián)合查詢執(zhí)行完全外部聯(lián)接(外部聯(lián)接:在這種聯(lián)接中,兩個(gè)表中的每條匹配記錄都在查詢結(jié)果中合并為一條記錄,并且其中一個(gè)表貢獻(xiàn)出它的所有記錄,即使聯(lián)接字段中的值與對(duì)方表中的字段不匹配也是如此。)。完全外部聯(lián)接并不限制從每個(gè)聯(lián)接表中返回的行,但會(huì)根據(jù)聯(lián)接字段中的值合并這些行。
使用聯(lián)合查詢執(zhí)行完全外部聯(lián)接:
在要用于完全外部聯(lián)接的字段上創(chuàng)建一個(gè)具有左外部聯(lián)接的查詢。
“開始”
在選項(xiàng)卡上的組中,單擊,然后單擊。
按 Ctrl+C 復(fù)制 SQL 代碼。
刪除 FROM 子句末尾的分號(hào),然后按 Enter。
UNION
鍵入,然后按 Enter。
注釋
在使用聯(lián)合查詢執(zhí)行完全外部聯(lián)接時(shí),請(qǐng)勿使用 ALL 關(guān)鍵字。
按 Ctrl+V 粘貼您在步驟 3 中復(fù)制的 SQL 代碼。
LEFT JOIN
在粘貼的代碼中,將更改為。
刪除第二個(gè) FROM 子句末尾的分號(hào),然后按 Enter。
添加一個(gè) WHERE 子句,將 FROM 子句中列出的第一個(gè)表(左表)中的聯(lián)接字段值更改為 NULL。
例如,如果 FROM 子句為:
FROM Products RIGHT JOIN [Order Details] ON Products.ID = [Order Details].[Product ID]
則應(yīng)添加以下 WHERE 子句:
WHERE Products.ID IS NULL
在 WHERE 子句的末尾鍵入一個(gè)分號(hào) (;),以指示聯(lián)合查詢已達(dá)末尾。
“設(shè)計(jì)”
在選項(xiàng)卡上的組中,單擊。
新聞熱點(diǎn)
疑難解答
圖片精選