SQL - UNION 與 JOIN:初學者的全面指南

你好,有抱負的 SQL 爱好者!我很高興能成為你進入 SQL 世界的導航者。今天,我們將解開 UNION 和 JOIN 兩個強大的 SQL 運算的神秘面紗,這兩個操作起初可能會讓人感到困惑,但很快會成為你數據操作的最佳夥伴。所以,來一杯咖啡,放鬆一下,我們一起來深入探討吧!

SQL - Union vs Join

了解基礎知識

在深入探討 UNION 和 JOIN 的細節之前,我們先用一個簡單的比喻來說明。想像你正在籌備一個派對,你有兩份客人名單:一份是你的朋友,另一份是你的家人。現在,你有兩個選擇:

  1. 將兩份名單合併成一份大的名單(這就像 UNION)
  2. 找出哪些朋友也是你的親人(這就像 JOIN)

有興趣嗎?太好了!讓我們詳細探討這兩種操作。

UNION 的運作

UNION 是什麼?

UNION 在 SQL 中就像一個總清單製作者。它將兩個或多個 SELECT 語句的結果合併成單一的结果集。當你想要合併結構相似的表中數據時,這非常完美。

UNION 的實際應用

假設我們有兩個表:employees_usaemployees_uk。我們想要得到一份無論地點的所有員工名單。

SELECT first_name, last_name, country
FROM employees_usa
UNION
SELECT first_name, last_name, country
FROM employees_uk;

這個查詢會給我們一份來自美國和英國辦事處的所有員工的合併名單。酷炫吧?

UNION ALL:包含重複的親戚

現在,如果我們想要包含重複的條目呢?這時 UNION ALL 就派上用場了。

SELECT product_name, category
FROM products_2021
UNION ALL
SELECT product_name, category
FROM products_2022;

這個查詢會列出 2021 年和 2022 年的所有產品,如果某個產品在兩年都有提供,則會包含重複。

須記住的重點

  1. UNION 默認會移除重複行
  2. UNION ALL 會保留所有行,包括重複行
  3. 所有 SELECT 語句中的列數和順序必須相同
  4. 對應列的數據類型應該是兼容的

JOIN 的運作

JOIN 是什麼?

如果 UNION 是一個清單製作者,那麼 JOIN 就像一個紅娘。它根據表中相關列將兩個或多個表的行合併起來。當你想要從多個表中检索相關數據時,這非常完美。

JOIN 的類型

讓我們用一個有趣的比喻來拆解不同類型的 JOIN。想像你在一個舞會上:

  1. INNER JOIN:只配對那些知道同樣舞蹈的舞者
  2. LEFT JOIN:配對所有左邊的舞者,即使他們沒有舞伴
  3. RIGHT JOIN:配對所有右邊的舞者,即使他們沒有舞伴
  4. FULL JOIN:配對所有舞者,即使有些會獨自跳舞

JOIN 的實際應用

讓我們看看這些 JOIN 在真實的 SQL 查詢中是如何工作的:

INNER JOIN

SELECT customers.name, orders.order_date
FROM customers
INNER JOIN orders ON customers.id = orders.customer_id;

這個查詢會顯示所有下過訂單的客戶及其訂單日期。

LEFT JOIN

SELECT employees.name, departments.dept_name
FROM employees
LEFT JOIN departments ON employees.dept_id = departments.id;

這個查詢會列出所有員工,即使他們沒有被分配到任何部門。

RIGHT JOIN

SELECT products.name, categories.category_name
FROM products
RIGHT JOIN categories ON products.category_id = categories.id;

這個查詢會顯示所有類別,即使有些類別沒有任何產品。

FULL JOIN

SELECT students.name, courses.course_name
FROM students
FULL JOIN enrollments ON students.id = enrollments.student_id
FULL JOIN courses ON enrollments.course_id = courses.id;

這個查詢會列出所有學生和所有課程,即使有些學生沒有報名任何課程,或者有些課程沒有學生。

UNION 與 JOIN 的對決

現在我們已經探討了 UNION 和 JOIN,讓我們將它們並列比較:

方面 UNION JOIN
目的 合併結構相似的表的行 合併相關表的列
結果 垂直組合(更多行) 水平組合(更多列)
表結構 必須有相同數量的列 可以有不同數量的列
重複處理 移除重複(除非 UNION ALL) 保持所有匹配行
性能 通常對大數據集更快 對複雜連接可能較慢
使用案例 結合來自不同來源的相似數據 從表中检索相關數據

結論:在 UNION 和 JOIN 間選擇

那麼,我們應該何時使用 UNION,何時選擇 JOIN 呢?這裡有一個簡單的經驗法則:

  • 當你想要將來自不同表的相似數據合併成一份名單時,使用 UNION。
  • 當你想要從多個表中检索相關數據時,使用 JOIN。

記住,就像選擇正確的工具來完成工作一樣,在 UNION 和 JOIN 間的選擇取決於你的具體數據需求。隨著實踐,你將會培養出一種直覺,知道在不同的情況下應該使用哪一個。

希望這份指南能幫助你解開 UNION 和 JOIN 的神秘。持續練習,保持好奇心,在你知道之前,你將會像專家一樣輕鬆地在 SQL 查詢中「舞蹈」!快樂編程!

Credits: Image by storyset