SQL 连接(JOIN)
SQL join 用于把来自两个或多个表的行结合起来。
下图展示了 LEFT JOIN、RIGHT JOIN、INNER JOIN、OUTER JOIN 相关的 7 种用法。
类型 | 描述 |
---|---|
INNER JOIN | 返回两个表中满足连接条件的记录(交集)。 |
LEFT JOIN | 返回左表中的所有记录,即使右表中没有匹配的记录(保留左表)。 |
RIGHT JOIN | 返回右表中的所有记录,即使左表中没有匹配的记录(保留右表)。 |
FULL OUTER JOIN | 返回两个表的并集,包含匹配和不匹配的记录。 |
CROSS JOIN | 返回两个表的笛卡尔积,每条左表记录与每条右表记录进行组合。 |
SELF JOIN | 将一个表与自身连接。 |
NATURAL JOIN | 基于同名字段自动匹配连接的表。 |
示例数据
表1:Fruits
sqlite> SELECT * FROM Fruits ;
1|Apple|苹果|中国|3.99|0.58|多汁,甜|红色
2|Banana|香蕉|厄瓜多尔|2.99|0.43|富含钾|黄色
3|Cherry|樱桃|美国|4.5|0.65|酸甜味|红色
4|Date|枣|伊朗|5|0.72|高纤维|棕色
5|Elderberry|接骨木果|欧洲|6|0.86|富含抗氧化剂|紫色
6|Fig|无花果|土耳其|3.5|0.5|甜,营养丰富|紫色
7|Grape|葡萄|中国|2.99|0.43|甜,无籽|绿色
8|Honeydew|哈密瓜|美国|1.5|0.22|甜,多汁|绿色
9|Kiwi|猕猴桃|新西兰|2.99|0.43|富含维生素C|棕色
10|Lemon|柠檬|意大利|1.2|0.17|酸味,柑橘类|黄色
11|Mango|芒果|印度|3|0.43|甜,热带风味|橙色
12|Nectarine|油桃|中国|2.5|0.36|甜,口感细腻|橙色
13|Orange|橙子|巴西|1|0.14|富含维生素C|橙色
14|Peach|桃子|美国|2.2|0.32|甜,多汁|粉红色
15|Quince|榅桲|土耳其|3.75|0.54|香气浓郁,酸味|黄色
16|Raspberry|覆盆子|加拿大|4|0.58|酸甜味|红色
17|Strawberry|草莓|中国|5|0.72|甜,多汁|红色
18|Tomato|番茄|墨西哥|2|0.29|富含维生素C|红色
19|Ugli Fruit|丑果|牙买加|3.5|0.5|甜,多汁|黄色
20|Vanilla|香草|巴布亚新几内亚|10|1.43|香气浓郁|棕色
21|Watermelon|西瓜|中国|1.5|0.22|甜,多汁|绿色
22|Xigua|西瓜|中国|1.5|0.22|甜,多汁|绿色
23|Yuzu|柚子|日本|4|0.58|酸甜味|黄色
24|Zucchini|西葫芦|意大利|2|0.29|口感细腻|绿色
25|Apricot|杏子|中国|3|0.43|甜,多汁|橙色
表2:Countries
sqlite> SELECT * FROM Countries ;
1|China|中国|北京|亚洲
2|United States|美国|华盛顿|北美洲
3|France|法国|巴黎|欧洲
4|Brazil|巴西|巴西利亚|南美洲
5|Australia|澳大利亚|堪培拉|大洋洲
6|India|印度|新德里|亚洲
7|Russia|俄罗斯|莫斯科|欧洲/亚洲
8|Germany|德国|柏林|欧洲
9|Japan|日本|东京|亚洲
10|Canada|加拿大|渥太华|北美洲
11|United Kingdom|英国|伦敦|欧洲
12|Italy|意大利|罗马|欧洲
13|South Africa|南非|比勒陀利亚|非洲
14|Argentina|阿根廷|布宜诺斯艾利斯|南美洲
15|Spain|西班牙|马德里|欧洲
16|Mexico|墨西哥|墨西哥城|北美洲
17|Indonesia|印度尼西亚|雅加达|亚洲
18|Nigeria|尼日利亚|阿布贾|非洲
19|Turkey|土耳其|安卡拉|欧洲/亚洲
20|Egypt|埃及|开罗|非洲
各连接结果对比
JOIN 类型 | 结果 |
---|---|
INNER JOIN | 返回两个表中匹配的记录。在给定的例子中,只有 CustomerID 为 1 和 2 的记录在两个表中都有匹配,所以只会返回这些记录。 |
LEFT JOIN | 返回左表(Customers)中的所有记录,即使右表(Orders)中没有匹配的记录。对于左表中没有匹配的右表记录,结果中的右表字段将为 NULL。在例子中,CustomerID 为 3 的记录在右表中没有匹配,所以其对应的 Product 将为 NULL。 |
RIGHT JOIN | 返回右表(Orders)中的所有记录,即使左表(Customers)中没有匹配的记录。对于右表中没有匹配的左表记录,结果中的左表字段将为 NULL。在例子中,OrderID 为 103 的记录在左表中没有匹配,所以其对应的 Name 将为 NULL。 |
FULL OUTER JOIN | 返回两个表中的所有记录,无论它们是否匹配。如果某个表中没有匹配的记录,那么该表的字段将为 NULL。在例子中,CustomerID 为 3 和 OrderID 为 103 的记录将分别在对方的表中显示为 NULL。 |
CROSS JOIN | 返回两个表的笛卡尔积,即左表中的每一行与右表中的每一行组合。在例子中,每个顾客都将与每个订单组合,产生多个结果。 |
SELF JOIN | 表与其自身进行连接。这通常用于查询表中相互关联的记录,比如员工与其经理之间的关系。 |
SQL JOIN
SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。
最常见的 JOIN 类型:SQL INNER JOIN(简单的 JOIN)。 SQL INNER JOIN 从多个表中返回满足 JOIN 条件的所有行。
语法:
SELECT column1, column2, ...
FROM table1
JOIN table2 ON condition;
参数说明:
- column1, column2, ...:要选择的字段名称,可以为多个字段。如果不指定字段名称,则会选择所有字段。
- table1:要连接的第一个表。
- table2:要连接的第二个表。
- condition:连接条件,用于指定连接方式。
演示 INNER JOIN
请注意,"Fruits" 表中的 "Origin" 列指向 "Countries" 表中的字段 "ChineseName"。上面这两个表是通过 "Fruits.Origin=Countries.ChineseName" 列联系起来的。
然后,如果我们运行下面的 SQL 语句(包含 INNER JOIN):
实例
SELECT * FROM Fruits INNER JOIN Countries ON Fruits.Origin=Countries.ChineseName;
执行以上 SQL 输出结果如下:
sqlite> SELECT * FROM Fruits INNER JOIN Countries ON Fruits.Origin=Countries.ChineseName;
1|Apple|苹果|中国|3.99|0.58|多汁,甜|红色|1|China|中国|北京|亚洲
3|Cherry|樱桃|美国|4.5|0.65|酸甜味|红色|2|United States|美国|华盛顿|北美洲
6|Fig|无花果|土耳其|3.5|0.5|甜,营养丰富|紫色|19|Turkey|土耳其|安卡拉|欧洲/亚洲
7|Grape|葡萄|中国|2.99|0.43|甜,无籽|绿色|1|China|中国|北京|亚洲
8|Honeydew|哈密瓜|美国|1.5|0.22|甜,多汁|绿色|2|United States|美国|华盛顿|北美洲
10|Lemon|柠檬|意大利|1.2|0.17|酸味,柑橘类|黄色|12|Italy|意大利|罗马|欧洲
11|Mango|芒果|印度|3|0.43|甜,热带风味|橙色|6|India|印度|新德里|亚洲
12|Nectarine|油桃|中国|2.5|0.36|甜,口感细腻|橙色|1|China|中国|北京|亚洲
13|Orange|橙子|巴西|1|0.14|富含维生素C|橙色|4|Brazil|巴西|巴西利亚|南美洲
14|Peach|桃子|美国|2.2|0.32|甜,多汁|粉红色|2|United States|美国|华盛顿|北美洲
15|Quince|榅桲|土耳其|3.75|0.54|香气浓郁,酸味|黄色|19|Turkey|土耳其|安卡拉|欧洲/亚洲
16|Raspberry|覆盆子|加拿大|4|0.58|酸甜味|红色|10|Canada|加拿大|渥太华|北美洲
17|Strawberry|草莓|中国|5|0.72|甜,多汁|红色|1|China|中国|北京|亚洲
18|Tomato|番茄|墨西哥|2|0.29|富含维生素C|红色|16|Mexico|墨西哥|墨西哥城|北美洲
21|Watermelon|西瓜|中国|1.5|0.22|甜,多汁|绿色|1|China|中国|北京|亚洲
22|Xigua|西瓜|中国|1.5|0.22|甜,多汁|绿色|1|China|中国|北京|亚洲
23|Yuzu|柚子|日本|4|0.58|酸甜味|黄色|9|Japan|日本|东京|亚洲
24|Zucchini|西葫芦|意大利|2|0.29|口感细腻|绿色|12|Italy|意大利|罗马|欧洲
25|Apricot|杏子|中国|3|0.43|甜,多汁|橙色|1|China|中国|北京|亚洲
演示 LEFT JOIN
SELECT * FROM Fruits LEFT JOIN Countries ON Fruits.Origin=Countries.ChineseName;
sqlite> SELECT * FROM Fruits LEFT JOIN Countries ON Fruits.Origin=Countries.ChineseName;
1|Apple|苹果|中国|3.99|0.58|多汁,甜|红色|1|China|中国|北京|亚洲
2|Banana|香蕉|厄瓜多尔|2.99|0.43|富含钾|黄色|||||
3|Cherry|樱桃|美国|4.5|0.65|酸甜味|红色|2|United States|美国|华盛顿|北美洲
4|Date|枣|伊朗|5|0.72|高纤维|棕色|||||
5|Elderberry|接骨木果|欧洲|6|0.86|富含抗氧化剂|紫色|||||
6|Fig|无花果|土耳其|3.5|0.5|甜,营养丰富|紫色|19|Turkey|土耳其|安卡拉|欧洲/亚洲
7|Grape|葡萄|中国|2.99|0.43|甜,无籽|绿色|1|China|中国|北京|亚洲
8|Honeydew|哈密瓜|美国|1.5|0.22|甜,多汁|绿色|2|United States|美国|华盛顿|北美洲
9|Kiwi|猕猴桃|新西兰|2.99|0.43|富含维生素C|棕色|||||
10|Lemon|柠檬|意大利|1.2|0.17|酸味,柑橘类|黄色|12|Italy|意大利|罗马|欧洲
11|Mango|芒果|印度|3|0.43|甜,热带风味|橙色|6|India|印度|新德里|亚洲
12|Nectarine|油桃|中国|2.5|0.36|甜,口感细腻|橙色|1|China|中国|北京|亚洲
13|Orange|橙子|巴西|1|0.14|富含维生素C|橙色|4|Brazil|巴西|巴西利亚|南美洲
14|Peach|桃子|美国|2.2|0.32|甜,多汁|粉红色|2|United States|美国|华盛顿|北美洲
15|Quince|榅桲|土耳其|3.75|0.54|香气浓郁,酸味|黄色|19|Turkey|土耳其|安卡拉|欧洲/亚洲
16|Raspberry|覆盆子|加拿大|4|0.58|酸甜味|红色|10|Canada|加拿大|渥太华|北美洲
17|Strawberry|草莓|中国|5|0.72|甜,多汁|红色|1|China|中国|北京|亚洲
18|Tomato|番茄|墨西哥|2|0.29|富含维生素C|红色|16|Mexico|墨西哥|墨西哥城|北美洲
19|Ugli Fruit|丑果|牙买加|3.5|0.5|甜,多汁|黄色|||||
20|Vanilla|香草|巴布亚新几内亚|10|1.43|香气浓郁|棕色|||||
21|Watermelon|西瓜|中国|1.5|0.22|甜,多汁|绿色|1|China|中国|北京|亚洲
22|Xigua|西瓜|中国|1.5|0.22|甜,多汁|绿色|1|China|中国|北京|亚洲
23|Yuzu|柚子|日本|4|0.58|酸甜味|黄色|9|Japan|日本|东京|亚洲
24|Zucchini|西葫芦|意大利|2|0.29|口感细腻|绿色|12|Italy|意大利|罗马|欧洲
25|Apricot|杏子|中国|3|0.43|甜,多汁|橙色|1|China|中国|北京|亚洲
不同的 SQL JOIN
在我们继续讲解实例之前,我们先列出您可以使用的不同的 SQL JOIN 类型:
- INNER JOIN:如果表中有至少一个匹配,则返回行
- LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
- RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
- FULL JOIN:只要其中一个表中存在匹配,则返回行