PostgreSQL - 连接操作
你好,有抱负的数据库爱好者们!今天,我们将踏上一段激动人心的旅程,探索PostgreSQL连接操作的世界。作为你友善的邻里计算机老师,我将引导你一步一步地完成这次冒险。别担心如果你之前从未编写过一行代码——我们将从最基础的内容开始,逐步提升。所以,戴上你的虚拟安全帽,让我们开始吧!
什么是连接操作?
在我们深入了解不同类型的连接操作之前,让我们先了解一下连接操作究竟是什么。想象你在策划一个大型派对(因为谁不喜欢一个好的数据库派对呢?)。你有两份名单:一份是你的朋友的名字,另一份是他们喜欢的饮料。连接操作就像神奇的派对策划者,帮助你以各种方式结合这些名单,创建出一个完美的宾客名单,上面有每个人的首选饮料。
在数据库术语中,连接操作允许我们根据它们之间的相关列,将两个或多个表中的行结合起来。现在,让我们探索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