使用SQL合并两个数据集可以通过JOINS来完成。JOIN是查询的FROM子句中的SQL指令,用于标识要查询的表以及它们应该如何组合。
主键和外键
通常,在关系数据库中,数据被组织到由属性(列)和记录(行)组成的各种表中。在每个表中存在一个列,该列是主键,该列中的每个条目唯一地表示该表中的单个行。这通常是ID(identifier的缩写)列。表中通过共享值与另一个表的主键建立关联的列称为外键。外键通常也是有标题的ID,但前面有被引用表的名称。
当使用JOIN将两个或多个表组合在一起时,就应用了这个概念。在下面的例子中,我们有两个表:用户表(表1)和事件表(表2)。我们希望将这两个表连接在一起,以获取用户数据以及事件数据。一个真实的例子是,如果你有一个CRM工具(如Salesforce)中包含付费用户(表1)和一个事件分析工具(如Mixpanel)中的数据,它可以跟踪所有在你的产品中执行某项操作的用户(表2)。
请注意,在两个表之间有一个以绿色突出显示的公共列(维度),即用户ID。在User Table中,ID列是用户ID,是该表的主键,而在Event Table中,User_ID列是外键,因为该列引用Users表中的ID列。我们可以使用这种关系将两个表连接在一起,以在一个表中获取用户和事件信息。
Meet the joins 满足连接
有三种常见的方法可以将任何两个或更多的表连接在一起,我们将首先讨论:外部连接(outer join)、内部连接(inner join) 和 左连接(left join)。使用上面的示例用户表(User Table) 和事件表(Event Table),让我们看看一些连接的示例…
Outer Join 外部连接
假设您希望拥有一个包含所有用户表和事件表数据的数据表。
您可以使用“outer join”将表连接在一起。如果可能,外部联接将来自一个或多个公共维度上的所有表的列组合在一起,并包括来自所有表的所有数据。
Inner Join 内部连接
What if you want to have a table that contains only users that have done an action?
如果您希望拥有一个只包含已执行操作的用户的表,该怎么办?
您可以使用内联接来将表联接在一起。如果可能,内部联接组合公共维度(前N列)上的列,并且仅包括公共N列中共享相同值的列的数据。在该示例中,用户ID将是用于内部联接的公共维度。
Left Join 左连接
现在,如果您希望拥有一个包含所有用户数据和这些用户执行的操作的表,该怎么办?不应包括不在用户表中的其他用户执行的操作?
您可以使用左连接将表连接在一起。如果可能,左联接将公共维度(前N列)上的列合并,返回第一个表中的所有行以及连续表中的匹配行。当没有匹配项时,连续表中的结果为NULL。在这种情况下,我们将使用户表作为左联接使用的第一个表(左表)。
Union and Cross Join 联合和交叉联接
除了这些常见的联接类型之外,还有一些方法会导致输出表中的额外行和更多列。其中两种连接类型称为Union和Cross Join。这些连接类型可能不适合上面的示例表,但是为了便于本文,我们仍然可以使用它们来了解这些连接是如何工作的。Union Join会将表堆叠在另一个的顶部,从而产生新的行。
一个很好的用例是,如果您希望通过追加而不是连接两个表来组合它们。交叉连接将导致一个表中的行的所有可能组合在一起。这可能会导致巨大的表,因此应谨慎使用。
交叉连接可能仅在表中包含单个值时使用,您希望在没有公共维度的情况下将这些值连接在一起。