SQLite - JOINS:精通結合表的藝術
你好,未來的數據庫大師!今天,我們將深入探索SQLite中最令人興奮(有時也會讓人感到有些害怕)的方面:JOINS。別擔心如果你是新手;在這個教學結束時,你將會像專業人士一樣結合表!
JOINS的介紹
在我們跳進深水區之前,讓我們先討論一下為什麼我們需要JOINS。想像你正在籌備一個盛大的生日派對(因為誰不喜歡一個好的派對呢?)。你有一個名單上面寫著客人的名字,另一個名單上面寫著他們喜歡的蛋糕口味。如果你能將這些名單合併,確保每個人都能得到他們偏好的蛋糕,豈不是很好?這正是數據庫中的JOINS所做的——它們幫助我們以有意義的方式將不同表中的信息合併起來。
現在,讓我們探討SQLite中的三種主要類型的JOINS:
- CROSS JOIN
- INNER JOIN
- OUTER JOIN
CROSS JOIN:派對調酒師
CROSS JOIN是什麼?
CROSS JOIN就像在派對上邀請所有人與其他人交流。它將一個表中的每一行與另一個表的每一行進行合併。這相當於數據庫中的「大家好,見見大家!」
CROSS JOIN語法
SELECT * FROM table1 CROSS JOIN table2;
CROSS JOIN範例
讓我們為我們的派對計劃創建兩個簡單的表:
CREATE TABLE guests (
guest_id INTEGER PRIMARY KEY,
guest_name TEXT
);
CREATE TABLE cakes (
cake_id INTEGER PRIMARY KEY,
cake_flavor TEXT
);
INSERT INTO guests (guest_name) VALUES ('Alice'), ('Bob'), ('Charlie');
INSERT INTO cakes (cake_flavor) VALUES ('Chocolate'), ('Vanilla'), ('Strawberry');
現在,讓我們使用CROSS JOIN:
SELECT guests.guest_name, cakes.cake_flavor
FROM guests CROSS JOIN cakes;
這個查詢將產生以下結果:
guest_name | cake_flavor |
---|---|
Alice | Chocolate |
Alice | Vanilla |
Alice | Strawberry |
Bob | Chocolate |
Bob | Vanilla |
Bob | Strawberry |
Charlie | Chocolate |
Charlie | Vanilla |
Charlie | Strawberry |
正如你所看到的,每個客人與每種蛋糕口味都配對了一次。這就像讓每個人嘗試所有的蛋糕!
當使用CROSS JOIN
CROSS JOIN在實際應用場景中很少使用,因為它可能會產生非常大的結果集。然而,它們很適合生成組合或創建測試數據。
INNER JOIN:完美配對
INNER JOIN是什麼?
INNER JOIN就像將知道同種舞蹈的舞伴配對起來。它根據兩個表之間的相關列來合併行。
INNER JOIN語法
SELECT * FROM table1 INNER JOIN table2 ON table1.column = table2.column;
INNER JOIN範例
讓我們修改我們的派對計劃情景。現在我們有客人和他們的蛋糕偏好:
CREATE TABLE guests (
guest_id INTEGER PRIMARY KEY,
guest_name TEXT,
preferred_cake_id INTEGER
);
CREATE TABLE cakes (
cake_id INTEGER PRIMARY KEY,
cake_flavor TEXT
);
INSERT INTO guests (guest_name, preferred_cake_id) VALUES
('Alice', 1), ('Bob', 2), ('Charlie', 3), ('David', 1);
INSERT INTO cakes (cake_flavor) VALUES
('Chocolate'), ('Vanilla'), ('Strawberry');
現在,讓我們使用INNER JOIN來匹配客人和他們偏好的蛋糕:
SELECT guests.guest_name, cakes.cake_flavor
FROM guests INNER JOIN cakes ON guests.preferred_cake_id = cakes.cake_id;
這個查詢將產生以下結果:
guest_name | cake_flavor |
---|---|
Alice | Chocolate |
Bob | Vanilla |
Charlie | Strawberry |
David | Chocolate |
完美!每個客人都與他們偏好的蛋糕口味配對了。
當使用INNER JOIN
INNER JOIN是最常見的JOIN類型。當你想要檢索兩個表中都有匹配值的數據時,使用它。
OUTER JOIN:不讓任何人落單
OUTER JOIN是什麼?
OUTER JOIN就像在派對上確保沒有人感到被遺忘。它返回一個或兩個表中的所有行,即使另一個表中沒有匹配的行。
有三种类型的OUTER JOIN:
- LEFT OUTER JOIN
- RIGHT OUTER JOIN(SQLite不支持)
- FULL OUTER JOIN(SQLite直接不支持)
我們將專注於LEFT OUTER JOIN,因為它是在SQLite中最常用的。
LEFT OUTER JOIN語法
SELECT * FROM table1 LEFT OUTER JOIN table2 ON table1.column = table2.column;
LEFT OUTER JOIN範例
讓我們添加一個沒有蛋糕偏好的客人:
INSERT INTO guests (guest_name, preferred_cake_id) VALUES ('Eve', NULL);
現在,讓我們使用LEFT OUTER JOIN:
SELECT guests.guest_name, cakes.cake_flavor
FROM guests LEFT OUTER JOIN cakes ON guests.preferred_cake_id = cakes.cake_id;
這個查詢將產生以下結果:
guest_name | cake_flavor |
---|---|
Alice | Chocolate |
Bob | Vanilla |
Charlie | Strawberry |
David | Chocolate |
Eve | NULL |
看到Eve也被包含在結果中,即使她沒有偏好的蛋糕,這就是LEFT OUTER JOIN的神奇之處!
當使用OUTER JOIN
當你想要包含一個表的所有記錄,無論它們是否在另一個表中具有匹配記錄時,使用OUTER JOIN。
結論
好了,各位!你剛剛踏入了SQLite JOINS的奇妙世界。記住,熟練來自練習,所以不要害怕嘗試這些查詢。
這裡是我們討論過的JOIN類型的快速參考表:
JOIN類型 | 使用場景 |
---|---|
CROSS JOIN | 結合每一行與其他每一行 |
INNER JOIN | 根據條件匹配行 |
LEFT JOIN | 包含左表的所有行,如果可能的話進行匹配 |
繼續結合那些表,很快你將會成為數據庫派對的明星!快樂查詢!
Credits: Image by storyset