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