SQL连接操作及其类型详解

对于数据科学爱好者或从业者来说,理解SQL连接操作是至关重要的。它们能够提高跨表的数据检索和操作效率。本文将简化SQL连接的学习曲线,揭示其简单性。将从解密SQL连接开始,深入掌握四种基本类型。

目录

  • SQL连接是什么?
  • SQL中不同类型的连接
  • SQL中的INNER JOIN
  • SQL中的RIGHT JOIN
  • SQL中的LEFT JOIN
  • SQL中的FULL JOIN
  • 何时使用哪种连接?
  • 结论
  • 常见问题解答

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的基础知识以及它如何应用于数据科学?查看受欢迎的课程“SQL for Data Science”。

SQL中的INNER JOIN

这就是在上一部分中介绍的内容。INNER JOIN返回在两个表中都有匹配值的记录:

SELECT * FROM BOYS INNER JOIN MESSI ON BOYS.id = MESSI.id;

输出:INNER JOIN给出了两个表的交集,即在两个表中都存在的行。

SQL中的RIGHT JOIN

假设想要所有喜欢看梅西踢球的人的ID和姓名。显然,有很多写这个查询的方法,但将通过连接来理解。

SELECT * FROM BOYS RIGHT JOIN MESSI ON BOYS.id = MESSI.id;

输出:RIGHT OUTER JOIN给出了两个表中都存在的行,以及梅西表中不在交集中的额外行。换句话说,RIGHT JOIN返回了右表的所有记录和左表中匹配的记录。

SQL中的LEFT JOIN

假设想要列出所有喜欢看梅西踢球的男孩,以及不喜欢看梅西踢球的男孩。

SELECT * FROM BOYS LEFT JOIN MESSI ON BOYS.id = MESSI.id;

输出:LEFT OUTER JOIN给出了两个表中都存在的行,以及男孩表中不在交集中的额外行。换句话说,LEFT JOIN返回了左表的所有记录和右表中匹配的记录。

SQL中的FULL 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中的连接是什么?

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485