对于数据科学爱好者或从业者来说,理解SQL连接操作是至关重要的。它们能够提高跨表的数据检索和操作效率。本文将简化SQL连接的学习曲线,揭示其简单性。将从解密SQL连接开始,深入掌握四种基本类型。
在深入探讨SQL中不同类型的连接之前,让先回答这个价值百万的问题。考虑以下两个集合的例子:假设蓝色圆圈代表所有男孩(BOYS)的集合,灰色代表喜欢看梅西踢球的人(MESSI)的集合。如果想要找出所有喜欢看梅西踢球的男孩,会怎么做?
有一种程序化的方法来解决这个问题:首先,从梅西表中选择所有不同的id,这些id代表下面的内部查询。然后,从男孩表中取出每个id,并与这个集合进行比较。如果id与其中任何一个匹配,那么就输出男孩表中的那一行。这与SQL中的'for循环'概念非常相似,称为子查询。
SELECT * FROM BOYS WHERE id IN (SELECT DISTINCT id FROM MESSI);
但在SQL中,还有另一种方法来解决这个问题。要开始理解连接,首先需要对真正想要的东西有一个不同的视角。在集合术语中:想要的是BOYS和MESSI的交集。在图形术语中,这被表达为:
感兴趣的是浅蓝色部分,对吧?这部分,或者内部部分(提示),是所有喜欢看梅西的男孩。现在要做的就是用SQL表达这个:
SELECT * FROM BOYS INNER JOIN MESSI ON BOYS.id = MESSI.id;
看看(内部)连接做了什么?它不能再简单了!这是理解连接的直观方法。
注意:文氏图并不直接适用于SQL,因为集合(表)中的项目不是相同的。但由于它们相互引用,可以使用文氏图来更好地理解这个概念。
现在,将扩展到更大的画面,学习SQL中不同类型的连接。考虑下面的示例表:
想要学习SQL的基础知识以及它如何应用于数据科学?查看受欢迎的课程“SQL for Data Science”。
这就是在上一部分中介绍的内容。INNER JOIN返回在两个表中都有匹配值的记录:
SELECT * FROM BOYS INNER JOIN MESSI ON BOYS.id = MESSI.id;
输出:INNER JOIN给出了两个表的交集,即在两个表中都存在的行。
假设想要所有喜欢看梅西踢球的人的ID和姓名。显然,有很多写这个查询的方法,但将通过连接来理解。
SELECT * FROM BOYS RIGHT JOIN MESSI ON BOYS.id = MESSI.id;
输出:RIGHT OUTER JOIN给出了两个表中都存在的行,以及梅西表中不在交集中的额外行。换句话说,RIGHT JOIN返回了右表的所有记录和左表中匹配的记录。
假设想要列出所有喜欢看梅西踢球的男孩,以及不喜欢看梅西踢球的男孩。
SELECT * FROM BOYS LEFT JOIN MESSI ON BOYS.id = MESSI.id;
输出:LEFT OUTER JOIN给出了两个表中都存在的行,以及男孩表中不在交集中的额外行。换句话说,LEFT JOIN返回了左表的所有记录和右表中匹配的记录。
最后,假设想要列出所有人,包括喜欢看梅西踢球的男孩。
SELECT * FROM BOYS FULL OUTER JOIN MESSI ON BOYS.id = MESSI.id;
输出:FULL OUTER JOIN给出了两个表中都存在的行,以及两个表中不在交集中的额外行。得到了当左表或右表有匹配时的所有记录。
情况:正在管理一个在线商店的数据库,想要分析销售数据和客户信息。目标是确定哪些产品在不同的客户群体中受欢迎。
解释(INNER JOIN):当想要匹配两个表中都存在的记录时,使用INNER JOIN。在这种情况下,将检索已经购买过商品的客户的销售数据和客户信息。
SELECT customers.name, products.product_name, sales.quantity FROM customers INNER JOIN sales ON customers.id = sales.customer_id INNER JOIN products ON sales.product_id = products.id;
解释(LEFT JOIN):当想要检索左表的所有记录和右表中的匹配记录时,使用LEFT JOIN。这有助于查看哪些产品已经被购买以及由谁购买,包括没有进行任何购买的客户。
SELECT customers.name, products.product_name, sales.quantity FROM customers LEFT JOIN sales ON customers.id = sales.customer_id LEFT JOIN products ON sales.product_id = products.id;
解释(RIGHT JOIN):当想要检索右表的所有记录和左表中的匹配记录时,使用RIGHT JOIN。这有助于识别哪些产品已经被购买以及由谁购买,包括没有被任何客户购买的产品。
SELECT customers.name, products.product_name, sales.quantity FROM customers RIGHT JOIN sales ON customers.id = sales.customer_id RIGHT JOIN products ON sales.product_id = products.id;
解释(FULL JOIN):当想要检索两个表中的所有记录,包括已经被购买的产品以及由谁购买,以及没有进行任何购买的客户时,使用FULL JOIN。
SELECT customers.name, products.product_name, sales.quantity FROM customers FULL JOIN sales ON customers.id = sales.customer_id FULL JOIN products ON sales.product_id = products.id;
根据分析目标和表之间的关系选择合适的连接类型,以从数据中获得所需的洞察。
想要学习SQL如何在数据科学中使用吗?强烈推荐查看这个精彩的课程——“数据科学中的结构化查询语言(SQL)”。
Q1. SQL中有哪些类型的连接?
A. SQL中的连接类型包括INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL JOIN,允许根据指定条件从多个相关表中检索数据。
Q2. SQL中的连接是什么?