PostgreSQL - 聯接 (JOINs)
Hello, 對資料庫充滿熱情的同好們!今天,我們將踏上一段刺激的旅程,探索 PostgreSQL 的 JOINs 世界。作為你們親切的鄰居電腦老師,我會指導你們這次冒險,一步一步來。別擔心如果你從未寫過一行代碼——我們會從最基本的開始,然後逐步進階。所以,戴上你們的虛擬安全帽,我們一起來潛入水中吧!
聯接 (JOINs) 是什麼?
在我們深入不同類型的 JOINs 之前,讓我們先了解 JOIN 實際上是什麼。想像你正在計劃一個大派對(因為誰不喜歡一個好的資料庫派對呢?)。你有兩個名單:一個是你朋友的姓名,另一個是他們喜歡的飲料。JOINs 就像神奇的派對策劃師,幫助你以各種方式結合這些名單,創造出完美的賓客名單,讓每個人都能享用到他們偏愛的飲料。
在資料庫術語中,JOINs 讓我們能夠基於兩個或多個表之間的相關列來結合行。現在,讓我們探討 PostgreSQL 提供我們的不同類型的 JOINs。
交叉聯接 (CROSS JOIN)
什麼是交叉聯接 (CROSS JOIN)?
交叉聯接就像不論你是否知道他們的飲料偏好,都邀請你兩個名單上的所有人來參加派對。它將第一個表的每一行與第二個表的每一行進行結合。
交叉聯接範例
讓我們為範例創建兩個簡單的表:
CREATE TABLE friends (
id SERIAL PRIMARY KEY,
name VARCHAR(50)
);
CREATE TABLE drinks (
id SERIAL PRIMARY KEY,
drink VARCHAR(50)
);
INSERT INTO friends (name) VALUES ('Alice'), ('Bob'), ('Charlie');
INSERT INTO drinks (drink) VALUES ('Cola'), ('Juice'), ('Water');
現在,讓我們進行交叉聯接:
SELECT f.name, d.drink
FROM friends f
CROSS JOIN drinks d;
結果:
name | drink |
---|---|
Alice | Cola |
Alice | Juice |
Alice | Water |
Bob | Cola |
Bob | Juice |
Bob | Water |
Charlie | Cola |
Charlie | Juice |
Charlie | Water |
正如你所看到的,每個朋友都與每種飲料配對。這可能不總是實際的,但它是生成所有可能組合的好方法。
內部聯接 (INNER JOIN)
什麼是內部聯接 (INNER JOIN)?
內部聯接更具選擇性。它就像將你的朋友與他們喜歡的飲料配對,但只包括那些有已知飲料偏好的朋友。
內部聯接範例
讓我們稍微修改一下我們的表:
CREATE TABLE friends (
id SERIAL PRIMARY KEY,
name VARCHAR(50)
);
CREATE TABLE favorite_drinks (
id SERIAL PRIMARY KEY,
friend_id INTEGER,
drink VARCHAR(50)
);
INSERT INTO friends (name) VALUES ('Alice'), ('Bob'), ('Charlie'), ('David');
INSERT INTO favorite_drinks (friend_id, drink) VALUES (1, 'Cola'), (2, 'Juice'), (3, 'Water');
現在,讓我們進行內部聯接:
SELECT f.name, fd.drink
FROM friends f
INNER JOIN favorite_drinks fd ON f.id = fd.friend_id;
結果:
name | drink |
---|---|
Alice | Cola |
Bob | Juice |
Charlie | Water |
注意,David 沒有出現在結果中,因為他沒有列出偏好的飲料。
左外聯接 (LEFT OUTER JOIN)
什麼是左外聯接 (LEFT OUTER JOIN)?
左外聯接就像確保你所有的朋友都在賓客名單上,即使你不知道他們的飲料偏好。那些沒有已知偏好的可能會得到一個默認飲料,或者根本沒有飲料。
左外聯接範例
使用與內部聯接範例中相同的表:
SELECT f.name, fd.drink
FROM friends f
LEFT OUTER JOIN favorite_drinks fd ON f.id = fd.friend_id;
結果:
name | drink |
---|---|
Alice | Cola |
Bob | Juice |
Charlie | Water |
David | NULL |
看到 David 現在被包含了,但是飲料為 NULL?這就是左外聯接的魔法!
右外聯接 (RIGHT OUTER JOIN)
什麼是右外聯接 (RIGHT OUTER JOIN)?
右外聯接與左外聯接相反。它就像確保所有飲料都在菜單上,即使沒有人選擇它們作為他們的偏好。
右外聯接範例
讓我們添加一種沒有人選擇作為偏好的飲料:
INSERT INTO favorite_drinks (drink) VALUES ('Lemonade');
SELECT f.name, fd.drink
FROM friends f
RIGHT OUTER JOIN favorite_drinks fd ON f.id = fd.friend_id;
結果:
name | drink |
---|---|
Alice | Cola |
Bob | Juice |
Charlie | Water |
NULL | Lemonade |
Lemonade 出現在名單上,即使沒有朋友選擇它作為偏好。
完全外聯接 (FULL OUTER JOIN)
什麼是完全外聯接 (FULL OUTER JOIN)?
完全外聯接是派對策劃師的夢想。它包括所有朋友和所有飲料,在可能的地方進行匹配,在沒有匹配的地方使用 NULL。
完全外聯接範例
SELECT f.name, fd.drink
FROM friends f
FULL OUTER JOIN favorite_drinks fd ON f.id = fd.friend_id;
結果:
name | drink |
---|---|
Alice | Cola |
Bob | Juice |
Charlie | Water |
David | NULL |
NULL | Lemonade |
這給我們提供了完整的圖景:所有朋友(即使是 David 沒有偏好的飲料)和所有飲料(即使是 Lemonade 沒有朋友喜歡)。
結論
這就是它,各位!我們已經穿越了 PostgreSQL JOINs 的領域,從無所不包的交叉聯接到全面的完全外聯接。記住,選擇正確的 JOIN 就像為你的派對選擇完美的混合——這完全取決於你需要的信息和你想要如何組合你的數據。
練習這些 JOINs,嘗試不同的場景,很快你將成為資料庫派對的焦點!誰知道管理數據可以如此有趣,對吧?下次見,快樂查詢!
聯接類型 | 描述 |
---|---|
CROSS JOIN | 將第一個表的每一行與第二個表的每一行進行結合 |
INNER JOIN | 在兩個表中都有匹配時返回行 |
LEFT OUTER JOIN | 返回左表的所有行,以及右表中匹配的行 |
RIGHT OUTER JOIN | 返回右表的所以行,以及左表中匹配的行 |
FULL OUTER JOIN | 在任一表中匹配時返回行 |
Credits: Image by storyset