MySQL - Union 與 Join 的差異:理解其不同之處

各位資料庫愛好者,大家好!今天,我們將踏上一段令人振奮的旅程,進入 MySQL 的世界,探索我們資料庫工具箱中的兩個強大工具:UNION 和 JOIN。作為你們親切的小區計算機老師,我將用清晰的解釋和大量的範例來引導你們理解這些概念。所以,拿起你的虛擬筆記本,讓我們一起深入探討吧!

MySQL - Union vs Join

理解基本概念

在我們深入 UNION 和 JOIN 的具體內容之前,讓我們先快速複習一下這些操作在 MySQL 中的功能。

UNION 是什麼?

UNION 就像一位大廚將不同食譜中的食材混合在一起,創造出一道美味的佳肴。它允許我們將兩個或多個 SELECT 說明的結果集組合成一個單一的結果集。

JOIN 是什麼?

另一方面,JOIN 則更像是一位紅娘。它幫助我們基於表之間的相關列來組合兩個或多個表的行。

現在我們已經有了基本的理解,讓我們更詳細地探索每一個。

UNION 的操作原理

UNION 用於組合兩個或多個 SELECT 說明的結果集。這裡是基本語法:

SELECT column1, column2, ... FROM table1
UNION
SELECT column1, column2, ... FROM table2;

讓我們用一個例子來剖析這個語法。假設我們有兩個表:fruitsvegetables

-- 創建並填充 fruits 表
CREATE TABLE fruits (
id INT PRIMARY KEY,
name VARCHAR(50),
color VARCHAR(20)
);

INSERT INTO fruits VALUES
(1, 'Apple', 'Red'),
(2, 'Banana', 'Yellow'),
(3, 'Grape', 'Purple');

-- 創建並填充 vegetables 表
CREATE TABLE vegetables (
id INT PRIMARY KEY,
name VARCHAR(50),
color VARCHAR(20)
);

INSERT INTO vegetables VALUES
(1, 'Carrot', 'Orange'),
(2, 'Broccoli', 'Green'),
(3, 'Eggplant', 'Purple');

-- 現在我們使用 UNION 來組合這些表
SELECT name, color FROM fruits
UNION
SELECT name, color FROM vegetables;

這個查詢將給我們一個所有水果和蔬菜的組合清單。結果會像這樣:

name color
Apple Red
Banana Yellow
Grape Purple
Carrot Orange
Broccoli Green
Eggplant Purple

注意,UNION 默認會移除重複的行。如果你想要保留重複的行,你可以使用 UNION ALL。

關於 UNION 的關鍵點:

  1. 所有 SELECT 說明中的列數和順序必須相同。
  2. 對應列的數據類型應該是兼容的。
  3. 默認情況下,UNION 會移除重複的行。使用 UNION ALL 來保留重複的行。

JOIN 的操作原理

JOIN 用於基於表之間的相關列來組合兩個或多個表的行。有幾種不同類型的 JOIN,但我們將聚焦於最常見的一種:INNER JOIN。

這裡是基本語法:

SELECT column1, column2, ...
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;

讓我們用一個例子來說明這個語法。假設我們有兩個表:customersorders

-- 創建並填充 customers 表
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
customer_name VARCHAR(50),
city VARCHAR(50)
);

INSERT INTO customers VALUES
(1, 'John Doe', 'New York'),
(2, 'Jane Smith', 'Los Angeles'),
(3, 'Bob Johnson', 'Chicago');

-- 創建並填充 orders 表
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
product VARCHAR(50),
amount DECIMAL(10, 2)
);

INSERT INTO orders VALUES
(101, 1, 'Laptop', 999.99),
(102, 2, 'Smartphone', 599.99),
(103, 1, 'Tablet', 299.99);

-- 現在我們使用 JOIN 來組合這些表
SELECT c.customer_name, o.product, o.amount
FROM customers c
INNER JOIN orders o
ON c.customer_id = o.customer_id;

這個查詢將給我們一個客戶及其訂單的清單。結果會像這樣:

customer_name product amount
John Doe Laptop 999.99
John Doe Tablet 299.99
Jane Smith Smartphone 599.99

關於 JOIN 的關鍵點:

  1. JOIN 基於表之間的相關列來組合行。
  2. ON 子句指定了表的連接條件。
  3. 有不同類型的 JOIN(INNER, LEFT, RIGHT, FULL),每種都有不同的行為。

UNION 與 JOIN:何時使用哪一個?

現在我們已經探索了 UNION 和 JOIN,你可能會想,何時使用每一個呢?讓我們來分析一下:

使用 UNION 時:

  1. 你想要組合來自類似表或查詢的行。
  2. 表具有相同的結構(列數和數據類型)。
  3. 你需要消除重複的行(或使用 UNION ALL 來保留它們)。

使用 JOIN 時:

  1. 你想要組合不同表的列。
  2. 表之間存在邏輯關係。
  3. 你需要檢索跨越多個表數據。

這裡有一個方便的對比表:

特點 UNION JOIN
目的 組合行 組合列
表結構 必須相似 可以不同
結果 垂直組合 水平組合
重複處理 默認移除(UNION ALL 保持) 取決於 JOIN 類型
性能 通常對大數據集更快 複雜 JOIN 可能較慢

記住,選擇 UNION 還是 JOIN 取決於你的特定數據結構和你要達到的結果。在不同的情景中練習以熟悉何時使用每一個。

總結來說,UNION 和 JOIN 都是 MySQL 中的強大工具,各自有不同的用途。UNION 帮助我們垂直組合類似數據,而 JOIN 則允許我們水平組合相關數據。隨著你繼續在 MySQL 中的旅程,你會發現這些操作在無數情景中都非常有用。繼續練習,不久你將成為一名 MySQL 大師!

祝大家在數據庫的魔法世界中愉快地探索!

Credits: Image by storyset