對於多個相似的選擇查詢,當您希望將它們返回的所有數據一起作為一個合並的集合查看時,便可以使用聯合查詢。
本文將向您介紹如何根據兩個或多個現有的選擇查詢創建聯合查詢,同時說明如何使用結構化查詢語言 (SQL) 編寫聯合查詢。
為完成本文中的示例,您應該對如何創建和運行選擇查詢有基本的了解。有關如何創建選擇查詢的詳細信息,請參閱請參閱部分中的鏈接。
本文內容
聯合查詢基礎知識
聯合查詢有哪些功能?
聯合查詢可合並多個相似的選擇查詢的結果集。
例如,假設您有兩個表,一個用於存儲有關客戶的信息,另一個用於存儲有關供應商的信息,並且這兩個表之間不存在任何關系。又假設這兩個表都有一些存儲聯系人信息的字段,而您希望同時查看這兩個表中的所有聯系人信息。
您可以為每個表都創建一個選擇查詢 (選擇查詢:就表中存儲的數據提出問題,然後在不更改數據的情況下以數據表的形式返回一個結果集。),以便只檢索包含聯系人信息的那些字段,但返回的信息仍將位於兩個單獨的位置。要將兩個或多個選擇查詢的結果合並到一個結果集中,可以使用聯合查詢。
聯合查詢的要求
聯合查詢中合並的選擇查詢必須具有相同的輸出字段數、采用相同的順序並包含相同或兼容的數據類型。在運行聯合查詢時,來自每組相應字段中的數據將合並到一個輸出字段中,這樣查詢輸出所包含的字段數將與每個 Select 語句相同。
注釋 根據聯合查詢的目的,“數字”和“文本”數據類型兼容。
聯合查詢是特定於 SQL 的。特定於 SQL 的查詢不能在“設計”視圖中顯示,因此必須直接用 SQL 編寫。在 Microsoft Office Access 2007 中,您可以使用“SQL 視圖”對象選項卡編寫特定於 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 子句列出了字段標識符 name、price、warranty_available 和 exclusive_offer。
- FROM Products 這是一個 FROM 子句。FROM 子句跟在 SELECT 子句之後,二者共同構成了一個基本的 Select 語句。FROM 後也跟有一個標識符列表,用於指示哪些表包含 SELECT 子句中列出的字段。FROM 子句必須始終至少列出一個表。此 FROM 子句列出了表標識符 Products。
- 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 語句。
- 復制該選擇查詢的 SQL 語句。
- 單擊此過程在步驟 1 中開始創建的聯合查詢的選項卡。
- 將選擇查詢的 SQL 語句粘貼到聯合查詢的 SQL 視圖對象選項卡中。
- 刪除選擇查詢 SQL 語句末尾的分號 (;)。
- 按 Enter 將光標移到下一行,然後在新行中鍵入 UNION。
您也可以再在其後鍵入一個空格,跟著鍵入 ALL 關鍵字,然後再次按 Enter。
- 單擊要合並到聯合查詢中的下一個選擇查詢的選項卡。
- 請重復此過程的步驟 5 到步驟 11,直至將選擇查詢的所有 SQL 語句都通過復制和粘貼的方式添加到聯合查詢的 SQL 視圖窗口中。對於最後一個選擇查詢的 SQL 語句,請勿刪除其分號或鍵入任何內容。
- 在“設計”選項卡上的“結果”組中,單擊“運行”。
聯合查詢的結果將顯示在“數據表”視圖 (數據表視圖:以行列格式顯示來自表、窗體、查詢、視圖或存儲過程的窗口。在數據表視圖中,可以編輯字段、添加和刪除數據,以及搜索數據。)中。
直接在 SQL 視圖中創建聯合查詢
以下過程將引導您完成在 SQL 視圖中創建基本聯合查詢的步驟。
- 在“創建”選項卡上的“其他”組中,單擊“查詢設計”。
在“設計”視圖中打開一個新查詢。
- 關閉“顯示表”對話框。
- 在“設計”選項卡上的“查詢”組中,單擊“聯合”。
將隱藏查詢設計窗口,並顯示 SQL 視圖對象選項卡。此時,SQL 視圖對象選項卡中沒有任何內容。
- 在“SQL 視圖”對象選項卡中,鍵入 SELECT,然後鍵入要包括在查詢中的第一個或第一組表中的字段列表。請使用逗號將各個字段名稱隔開。在鍵入完字段名稱的列表後,請按 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 語句),它創建一個新表,然後通過從一個現有表中復制記錄,在新表中創建記錄(行)。)的基礎:
-
- 創建並保存該聯合查詢。
- 在“創建”選項卡上的“其他”組中,單擊“查詢設計”。
- 在“顯示表”對話框中,單擊“查詢”選項卡。
- 雙擊該聯合查詢,然後關閉“顯示表”對話框。
注釋 如果消息欄中顯示了安全警告,則說明可能禁用了生成表查詢等動作查詢。要允許動作查詢運行,請單擊消息欄上的“選項”,然後在“Microsoft Office 安全選項”中單擊“啟用此內容”。
- 在查詢設計網格中,雙擊聯合查詢對象選項卡上的星號 (*),以使用聯合查詢的所有字段創建新表。
-或-
雙擊要在新表中使用的每個字段。
- 在“設計”選項卡上的“查詢類型”組中,單擊“生成表”。
- 在“生成表”對話框中,為新表鍵入一個名稱。您還可以指定另一個數據庫來創建新表。完成後請單擊“確定”。
- 在“設計”選項卡上的“結果”組中,單擊“運行”。
- 您可以使用聯合查詢執行完全外部聯接 (外部聯接:在這種聯接中,兩個表中的每條匹配記錄都在查詢結果中合並為一條記錄,並且其中一個表貢獻出它的所有記錄,即使聯接字段中的值與對方表中的字段不匹配也是如此。)。完全外部聯接並不限制從每個聯接表中返回的行,但會根據聯接字段中的值合並這些行。
使用聯合查詢執行完全外部聯接:
- 在要用於完全外部聯接的字段上創建一個具有左外部聯接的查詢。
- 在“開始”選項卡上的“視圖”組中,單擊“視圖”,然後單擊“SQL 視圖”。
- 按 Ctrl+C 復制 SQL 代碼。
- 刪除 FROM 子句末尾的分號,然後按 Enter。
- 鍵入 UNION,然後按 Enter。
注釋 在使用聯合查詢執行完全外部聯接時,請勿使用 ALL 關鍵字。
- 按 Ctrl+V 粘貼您在步驟 3 中復制的 SQL 代碼。
- 在粘貼的代碼中,將 LEFT JOIN 更改為 RIGHT 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 子句的末尾鍵入一個分號 (;),以指示聯合查詢已達末尾。
- 在“設計”選項卡上的“結果”組中,單擊“運行”。