SQLite - JOINS:精通結合表的藝術

你好,未來的數據庫大師!今天,我們將深入探索SQLite中最令人興奮(有時也會讓人感到有些害怕)的方面:JOINS。別擔心如果你是新手;在這個教學結束時,你將會像專業人士一樣結合表!

SQLite - JOINS

JOINS的介紹

在我們跳進深水區之前,讓我們先討論一下為什麼我們需要JOINS。想像你正在籌備一個盛大的生日派對(因為誰不喜歡一個好的派對呢?)。你有一個名單上面寫著客人的名字,另一個名單上面寫著他們喜歡的蛋糕口味。如果你能將這些名單合併,確保每個人都能得到他們偏好的蛋糕,豈不是很好?這正是數據庫中的JOINS所做的——它們幫助我們以有意義的方式將不同表中的信息合併起來。

現在,讓我們探討SQLite中的三種主要類型的JOINS:

  1. CROSS JOIN
  2. INNER JOIN
  3. 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:

  1. LEFT OUTER JOIN
  2. RIGHT OUTER JOIN(SQLite不支持)
  3. 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