PostgreSQL - 连接操作

你好,有抱负的数据库爱好者们!今天,我们将踏上一段激动人心的旅程,探索PostgreSQL连接操作的世界。作为你友善的邻里计算机老师,我将引导你一步一步地完成这次冒险。别担心如果你之前从未编写过一行代码——我们将从最基础的内容开始,逐步提升。所以,戴上你的虚拟安全帽,让我们开始吧!

PostgreSQL - Joins

什么是连接操作?

在我们深入了解不同类型的连接操作之前,让我们先了解一下连接操作究竟是什么。想象你在策划一个大型派对(因为谁不喜欢一个好的数据库派对呢?)。你有两份名单:一份是你的朋友的名字,另一份是他们喜欢的饮料。连接操作就像神奇的派对策划者,帮助你以各种方式结合这些名单,创建出一个完美的宾客名单,上面有每个人的首选饮料。

在数据库术语中,连接操作允许我们根据它们之间的相关列,将两个或多个表中的行结合起来。现在,让我们探索PostgreSQL为我们提供的一些不同类型的连接操作。

交叉连接(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)

什么是内连接?

内连接更具选择性。它就像将你的朋友与他们的喜欢的饮料相匹配,但只包括那些有已知饮料偏好的朋友。

内连接示例

让我们稍微修改一下我们的表:

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)

什么是左外连接?

左外连接就像确保你的所有朋友都在宾客名单上,即使你不知道他们的饮料偏好。那些没有已知偏好的朋友可能会得到一个默认饮料或者没有饮料。

左外连接示例

使用与内连接示例相同的表:

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)

什么是右外连接?

右外连接是左外连接的反面。它就像确保所有饮料都在菜单上,即使没有人选择它们作为他们的喜好。

右外连接示例

让我们添加一个没有人选择作为他们喜欢的饮料:

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)

什么是全外连接?

全外连接是派对策划者的梦想。它包括所有朋友和所有饮料,在可能的情况下将它们匹配,并在没有匹配的情况下使用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连接操作的土地,从包容万象的交叉连接到全面的全外连接。记住,选择正确的连接就像为你的派对挑选完美的混合饮料一样——这完全取决于你需要的信息以及你想如何合并你的数据。

练习这些连接操作,尝试不同的场景,很快你将成为数据库派对的灵魂人物!谁知道管理数据可以如此有趣呢,对吧?下次见,快乐查询!

Credits: Image by storyset