SQLite - 连接(JOINs):掌握结合表的技艺

你好,未来的数据库大师们!今天,我们将深入探讨SQLite中最令人兴奋(有时也可能令人畏惧)的一个方面:连接(JOINS)。如果你是新手,不用担心;在本教程结束时,你将能够像专业人士一样连接表!

SQLite - JOINS

连接(JOINS)简介

在我们跳入深水区之前,让我们先谈谈为什么我们需要连接(JOINS)。想象一下,你正在组织一个盛大的生日派对(因为谁不喜欢一个好的派对,对吧?)。你有一个名单上写着宾客的名字,另一个名单上写着他们喜欢的蛋糕口味。如果你能将这些名单合并,以确保每个人都能得到他们喜欢的蛋糕,那不是很好吗?这正是数据库中的连接(JOINS)所做的——它们帮助我们以有意义的方式将来自不同表的信息结合起来。

现在,让我们来探索SQLite中的三种主要连接类型:

  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 ('巧克力'), ('香草'), ('草莓');

现在,让我们使用交叉连接(CROSS JOIN):

SELECT guests.guest_name, cakes.cake_flavor
FROM guests CROSS JOIN cakes;

这个查询将产生以下结果:

guest_name cake_flavor
Alice 巧克力
Alice 香草
Alice 草莓
Bob 巧克力
Bob 香草
Bob 草莓
Charlie 巧克力
Charlie 香草
Charlie 草莓

正如你所看到的,每位嘉宾都与每种蛋糕口味搭配。这就像给每个人尝尝所有的蛋糕!

何时使用交叉连接(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
('巧克力'), ('香草'), ('草莓');

现在,让我们使用内连接(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 巧克力
Bob 香草
Charlie 草莓
David 巧克力

完美!每位嘉宾都匹配到了他们喜欢的蛋糕口味。

何时使用内连接(INNER JOIN)

内连接(INNER 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 巧克力
Bob 香草
Charlie 草莓
David 巧克力
Eve NULL

看看Eve也被包含在结果中,尽管她没有喜欢的蛋糕。这就是左外连接(LEFT OUTER JOIN)的魔力!

何时使用外连接(OUTER JOIN)

当你想要包含一个表中的所有记录,而不考虑它们是否在另一个表中有匹配记录时,请使用外连接(OUTER JOIN)。

结论

就这样,伙计们!你已经迈入了SQLite连接(JOINS)的精彩世界。记住,熟能生巧,所以不要害怕用这些查询进行实验。

以下是我们在本教程中讨论过的连接类型的快速参考表:

连接类型 用例
交叉连接 组合每一行与每一其他行
内连接 基于条件匹配行
左连接 包含左侧表的所有行,尽可能匹配

继续连接那些表,很快你将成为数据库派对的灵魂人物!快乐查询!

Credits: Image by storyset