在数据分析任务中,经常需要从多个数据源中获取数据。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;