MySQL - Union 與 Join 的差異:理解其不同之處
各位資料庫愛好者,大家好!今天,我們將踏上一段令人振奮的旅程,進入 MySQL 的世界,探索我們資料庫工具箱中的兩個強大工具:UNION 和 JOIN。作為你們親切的小區計算機老師,我將用清晰的解釋和大量的範例來引導你們理解這些概念。所以,拿起你的虛擬筆記本,讓我們一起深入探討吧!
理解基本概念
在我們深入 UNION 和 JOIN 的具體內容之前,讓我們先快速複習一下這些操作在 MySQL 中的功能。
UNION 是什麼?
UNION 就像一位大廚將不同食譜中的食材混合在一起,創造出一道美味的佳肴。它允許我們將兩個或多個 SELECT 說明的結果集組合成一個單一的結果集。
JOIN 是什麼?
另一方面,JOIN 則更像是一位紅娘。它幫助我們基於表之間的相關列來組合兩個或多個表的行。
現在我們已經有了基本的理解,讓我們更詳細地探索每一個。
UNION 的操作原理
UNION 用於組合兩個或多個 SELECT 說明的結果集。這裡是基本語法:
SELECT column1, column2, ... FROM table1
UNION
SELECT column1, column2, ... FROM table2;
讓我們用一個例子來剖析這個語法。假設我們有兩個表:fruits
和 vegetables
。
-- 創建並填充 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 的關鍵點:
- 所有 SELECT 說明中的列數和順序必須相同。
- 對應列的數據類型應該是兼容的。
- 默認情況下,UNION 會移除重複的行。使用 UNION ALL 來保留重複的行。
JOIN 的操作原理
JOIN 用於基於表之間的相關列來組合兩個或多個表的行。有幾種不同類型的 JOIN,但我們將聚焦於最常見的一種:INNER JOIN。
這裡是基本語法:
SELECT column1, column2, ...
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;
讓我們用一個例子來說明這個語法。假設我們有兩個表:customers
和 orders
。
-- 創建並填充 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 的關鍵點:
- JOIN 基於表之間的相關列來組合行。
- ON 子句指定了表的連接條件。
- 有不同類型的 JOIN(INNER, LEFT, RIGHT, FULL),每種都有不同的行為。
UNION 與 JOIN:何時使用哪一個?
現在我們已經探索了 UNION 和 JOIN,你可能會想,何時使用每一個呢?讓我們來分析一下:
使用 UNION 時:
- 你想要組合來自類似表或查詢的行。
- 表具有相同的結構(列數和數據類型)。
- 你需要消除重複的行(或使用 UNION ALL 來保留它們)。
使用 JOIN 時:
- 你想要組合不同表的列。
- 表之間存在邏輯關係。
- 你需要檢索跨越多個表數據。
這裡有一個方便的對比表:
特點 | UNION | JOIN |
---|---|---|
目的 | 組合行 | 組合列 |
表結構 | 必須相似 | 可以不同 |
結果 | 垂直組合 | 水平組合 |
重複處理 | 默認移除(UNION ALL 保持) | 取決於 JOIN 類型 |
性能 | 通常對大數據集更快 | 複雜 JOIN 可能較慢 |
記住,選擇 UNION 還是 JOIN 取決於你的特定數據結構和你要達到的結果。在不同的情景中練習以熟悉何時使用每一個。
總結來說,UNION 和 JOIN 都是 MySQL 中的強大工具,各自有不同的用途。UNION 帮助我們垂直組合類似數據,而 JOIN 則允許我們水平組合相關數據。隨著你繼續在 MySQL 中的旅程,你會發現這些操作在無數情景中都非常有用。繼續練習,不久你將成為一名 MySQL 大師!
祝大家在數據庫的魔法世界中愉快地探索!
Credits: Image by storyset