SQLite - 连接(JOINs):掌握结合表的技艺
你好,未来的数据库大师们!今天,我们将深入探讨SQLite中最令人兴奋(有时也可能令人畏惧)的一个方面:连接(JOINS)。如果你是新手,不用担心;在本教程结束时,你将能够像专业人士一样连接表!
连接(JOINS)简介
在我们跳入深水区之前,让我们先谈谈为什么我们需要连接(JOINS)。想象一下,你正在组织一个盛大的生日派对(因为谁不喜欢一个好的派对,对吧?)。你有一个名单上写着宾客的名字,另一个名单上写着他们喜欢的蛋糕口味。如果你能将这些名单合并,以确保每个人都能得到他们喜欢的蛋糕,那不是很好吗?这正是数据库中的连接(JOINS)所做的——它们帮助我们以有意义的方式将来自不同表的信息结合起来。
现在,让我们来探索SQLite中的三种主要连接类型:
- 交叉连接(CROSS JOIN)
- 内连接(INNER JOIN)
- 外连接(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)有三种类型:
- 左外连接(LEFT OUTER JOIN)
- 右外连接(RIGHT OUTER JOIN)(SQLite不支持)
- 全外连接(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