SQLite - UNIONS 子句

Hello, 未來的數據庫巫師們!今天,我們將踏上一段令人興奮的旅程,進入 SQLite 的世界,並探討神奇的 UNIONS 子句。作為你們親切鄰居的計算機老師,我將一步步地指導你們這次冒險。所以,拿起你們的虛擬魔杖(鍵盤),讓我們開始吧!

SQLite - UNIONS Clause

什麼是 UNION?

想像你有兩個分開的喜歡的冰淇淋口味列表 - 一個是去年夏天的,另一個是今年夏天的。現在,如果你想把這些列表合並成一個包含所有喜歡口味的超級列表,那麼 UNION 在 SQLite 中的作用就是這樣的,但它是對數據庫表而不是冰淇淋口味進行的!

在 SQLite 中,UNION 子句允許你合並兩個或多個 SELECT 說明的結果集。這就像是在組織一個盛大派對,讓不同的數據群體可以交流並形成一個新的、更大的群體。

基本語法

UNION 的基本語法如下:

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

讓我們分解一下:

  1. 我們有兩個 SELECT 說明。
  2. 每個 SELECT 說明可以查詢不同的表。
  3. UNION 鍵詞坐落在这兩個說明之間,起到橋樑的作用。

重要規則

在我們深入範例之前,讓我們來了解一下使用 UNION 的一些重要規則:

  1. 所有 SELECT 說明中的列數和順序必須相同。
  2. 相應列的數據類型應該是兼容的。 3.默認情況下,UNION 會移除重複的行(稍後我們將看到如何更改這一點)。

UNION 的應用

讓我們創建一些範例表並看看 UNION 的應用!

-- 創建並填充 'employees' 表
CREATE TABLE employees (
id INTEGER PRIMARY KEY,
name TEXT,
department TEXT
);

INSERT INTO employees (name, department) VALUES
('Alice', 'HR'),
('Bob', 'IT'),
('Charlie', 'Finance');

-- 創建並填充 'contractors' 表
CREATE TABLE contractors (
id INTEGER PRIMARY KEY,
name TEXT,
department TEXT
);

INSERT INTO contractors (name, department) VALUES
('David', 'Marketing'),
('Eve', 'IT'),
('Frank', 'HR');

現在,讓我們使用 UNION 來合並這些表:

SELECT name, department FROM employees
UNION
SELECT name, department FROM contractors;

這個查詢將返回:

Alice    HR
Bob      IT
Charlie  Finance
David    Marketing
Eve      IT
Frank    HR

這裡發生了什麼?UNION 子句將兩個表的結果合並起來,給我們提供了一個沒有任何重複的工人(員工和承包商)的完整列表。

重複資料的魔法

你注意到什麼有趣的事情了嗎?即使我們在 HR 部門有兩個人(Alice 和 Frank),它們都在我們的結果中出現。這是因為 UNION 自動基於所有列的值移除重複行。

如果我們在兩個表中都有完全相同名字和部門的人,UNION 會只顯示他們一次。例如:

INSERT INTO contractors (name, department) VALUES ('Alice', 'HR');

SELECT name, department FROM employees
UNION
SELECT name, department FROM contractors;

這將給我們與之前相同的結果,不會多出一個 HR 部門的 'Alice'。

UNION ALL 子句

有時候,你可能想要保留所有行,即使是重複的。這時 UNION ALL 會派上用場。這就像告訴數據庫:"我想要派對上的所有人,即使他們有個雙胞胎!"

讓我們修改我們之前的查詢:

SELECT name, department FROM employees
UNION ALL
SELECT name, department FROM contractors;

現在我們得到:

Alice    HR
Bob      IT
Charlie  Finance
David    Marketing
Eve      IT
Frank    HR
Alice    HR

看見了嗎?我們現在在 HR 部門有了兩個 'Alice' 的條目?UNION ALL保留了所有行,無論是否有重複。

實際應用

UNION 和 UNION ALL 不僅是為了好玩 - 它們還有實際應用!以下是一些你可能會使用它們的情節:

  1. 合並結構相似的多个表中的數據(如我們的員工和承包商範例)。
  2. 創建涵蓋不同時間段或類別的報告。
  3. 合並來自不同數據庫或數據源的数据。

讓我們看一個更複雜的範例。想像我們經營一家書店,並想查看所有交易,無論它是購買還是退貨:

-- 創建並填充 'purchases' 表
CREATE TABLE purchases (
id INTEGER PRIMARY KEY,
book_title TEXT,
amount DECIMAL(10, 2),
transaction_date DATE
);

INSERT INTO purchases (book_title, amount, transaction_date) VALUES
('The Great Gatsby', 15.99, '2023-06-01'),
('To Kill a Mockingbird', 12.50, '2023-06-02'),
('1984', 10.99, '2023-06-03');

-- 創建並填充 'returns' 表
CREATE TABLE returns (
id INTEGER PRIMARY KEY,
book_title TEXT,
amount DECIMAL(10, 2),
transaction_date DATE
);

INSERT INTO returns (book_title, amount, transaction_date) VALUES
('The Great Gatsby', -15.99, '2023-06-05'),
('Pride and Prejudice', -14.99, '2023-06-06');

-- 合並購買和退貨
SELECT book_title, amount, transaction_date, 'Purchase' as transaction_type
FROM purchases
UNION ALL
SELECT book_title, amount, transaction_date, 'Return' as transaction_type
FROM returns
ORDER BY transaction_date;

這個查詢將給我們:

The Great Gatsby       15.99   2023-06-01  Purchase
To Kill a Mockingbird  12.50   2023-06-02  Purchase
1984                   10.99   2023-06-03  Purchase
The Great Gatsby      -15.99   2023-06-05  Return
Pride and Prejudice   -14.99   2023-06-06  Return

在這裡,我們使用 UNION ALL 來合並購買和退貨,添加了一列以區分交易類型,並按日期排序。

總結

以下是一個總結 UNION 在 SQLite 中的常見方法的表格:

方法 描述 範例
UNION 合並兩個或多個 SELECT 說明的結果,並移除重複 SELECT * FROM table1 UNION SELECT * FROM table2
UNION ALL 合並兩個或多個 SELECT 說明的結果,並保留所有行,包括重複 SELECT * FROM table1 UNION ALL SELECT * FROM table2
ORDER BY 與 UNION 一起使用,對合並的結果進行排序 (SELECT * FROM table1 UNION SELECT * FROM table2) ORDER BY column_name
WHERE 在個別的 SELECT 說明中使用,以在合並之前過濾結果 SELECT * FROM table1 WHERE condition UNION SELECT * FROM table2 WHERE condition

至於你們,各位!你們剛剛通過掌握 UNION 子句來提升了自己的 SQLite 技能。記住,熟能生巧,所以不要害怕在自家的數據集上實驗這些查詢。祝查詢愉快,願你的 UNION 永遠成功!

Credits: Image by storyset