Navicat 部落格

不使用聯結查詢多個資料表 2021 年 3 月 15 日,由 Robert Gravelle 撰寫

通常,查詢正規化資料庫需要將資料表的一個或多個通用欄位聯結。否則,可能會產生笛卡爾積。這是一個列數等於第一個資料表列數乘以第二個資料表列數的結果集。因此,如果輸入包含 1000 人和 1000 個電話號碼,則結果會有 1,000,000 個組合!這種做法並不好。話雖如此,如果你想彙總不直接相關但相似的資料表中的資料,可以使用 UNION 運算子。在今天的文章中,我們將學習一些有關使用 UNION 及其相類似的 UNION ALL 的要點。

UNION 與 UNION ALL 比較

有人認為 UNION 和 UNION ALL 是可以互換的。但事實是他們不能互換。它們的不同之處在於,UNION 會移除重複的列或記錄,而 UNION ALL 則不會移除;相反,UNION ALL 只是從表中選取滿足查詢的 WHERE 條件的所有列,並組合它們為一個結果集。

將結果與 UNION 組合

以下的查詢使用 Sakila 範例資料庫。它是一個組合了兩個 SELECT 查詢結果的查詢:

假設你要尋找所有名字與 ID 8 的演員的名字相同的所有演員和客戶的名稱,但不傳回演員 8 的詳細資料。儘管有多種方法可以達成此目的,其中一種方案是採用 UNION ALL(如果每個結果集之間沒有重複項目,也可以使用 UNION)。以下是在 Navicat Premium 資料庫開發和管理用戶端中完成這項工作的查詢以及其結果:

customer and actors with same first names (61K)

在以上的查詢中,上面的 SELECT 擷取名字符合 actor_id 為 8 的演員名字的客戶,而下面的查詢則擷取與 ID 8 的演員有相同名字的其他演員。

如果你是 Navicat 的使用者,你應該已經知道它的編輯器是最好的編輯器之一。它提供語法突顯、可重複使用的程式碼片段以及自動完成程式碼功能。當你開始輸入單字時,會彈出一個包含有關結構描述、資料表或檢視、欄以及預存程序和函式的所有內容的建議清單。以下是 UNION 運算子:

union_operator (15K)

讓我就 UNION 和 UNION ALL 說最後幾句話。所有查詢傳回相同數量的欄是非常重要,否則你會收到類似以下的錯誤:

error_message (5K)

就是說,欄類型不必在所有 SELECT 陳述式中都對應。

最後,請記住,在使用 UNION 或 UNION ALL 時,結果集的欄名稱由第一個 SELECT 來決定。

總結

UNION 和 UNION ALL 運算子是用於彙總不直接相關但相似的資料表中的資料的理想工具。

如果你想嘗試 Navicat Premium,可以免費試用 14 天,以進行評估!

Navicat 文章
頻道記錄
分享
部落格封存檔