在数据分析任务中,经常需要从多个数据源中获取数据。SQL连接(JOIN)操作是将这些数据整合在一起的重要工具。本文将探讨SQL连接操作的基本概念,包括不同类型的SQL连接,并通过实例演示它们在实际数据合并中的应用。
在SQL中,JOIN
子句用于根据它们之间的相关列将两个或多个表中的行组合起来。JOIN
在不同表之间创建逻辑关联,并有效地从这些表中获取所需数据。根据需要在多个表之间建立的逻辑关联类型,有四种基本的SQL连接类型:
这个问题有助于面试官了解候选人是否对连接操作有基本的理解。
两者的主要区别在于,在连接两个表时,INNER JOIN
仅提取两个表中都存在的行,而OUTER JOIN
除了提取两个表中都存在的行之外,还会提取两个表中不共同的行。
下面通过实例来展示这些连接操作是如何工作的。
逻辑上,这返回两个数据集的交集,即只返回同时属于两个表的行或记录。例如,假设有关于学生的虚拟数据和关于订单的虚拟数据。使用INNER JOIN可以如下操作:
SELECT student.Student_id, orders.order_id, orders.order_date
FROM student
INNER JOIN orders
ON student.Student_id = orders.Student_id
ORDER BY student.Student_id;
如上查询返回了两个表中Student_id
值匹配的所有行。在student
表中Student_id
等于8000和9000的行将被省略,因为它们在两个表中都不存在。在orders
表中order_id
为5的行也将被省略,因为Student_id
为NULL的行在student
表中不存在。
OUTER JOIN
通过结合LEFT JOIN
和RIGHT JOIN
的结果来创建结果集。结果集将包含两个表中的所有行。对于没有匹配的行,结果集将包含NULL
值。
SELECT Student.Student_id, orders.order_id, orders.order_date
FROM Student
OUTER JOIN orders
ON Student.Student_id = orders.Student_id
ORDER BY Student.Student_id;
这个OUTER JOIN
示例将返回orders
表中的所有行和student
表中的所有行。当连接条件不满足时,结果集中的那些字段将显示为NULL
。这意味着如果student
表中的Student_id
值在orders
表中不存在,orders
表中的所有字段在结果集中将显示为NULL
。同样,如果orders
表中的Student_id
值在student
表中不存在,student
表中的所有字段在结果集中将显示为NULL
。
两者的主要区别在于,在连接两个表时,LEFT JOIN
返回左表的所有行以及右表中匹配的行,而RIGHT JOIN
返回右表的所有行以及左表中匹配的行。
LEFT JOIN
返回左表的所有行和右表中匹配的行。对于右表中没有匹配的行,结果集将包含null
。
SELECT Student.Student_id, orders.order_id, orders.order_date
FROM Student
LEFT JOIN orders
ON Student.Student_id = orders.Student_id
ORDER BY Student.Student_id;
这个LEFT JOIN
示例将返回student
表中的所有行和orders
表中匹配的行。如果student
表中的Student_id
值在orders
表中不存在,orders
表中的所有字段在结果集中将显示为NULL
。
SELECT Student.Student_id, orders.order_id, orders.order_date
FROM Student
RIGHT JOIN orders
ON Student.Student_id = orders.Student_id
ORDER BY Student.Student_id;