这篇文章是对SQL中JOIN语法的一个可视化解释
我认为Ligaya Turmelle的“post on SQL joins”一文是初学者很好的入门指南。由于SQL的JOINS语法是建立在集合论基础之上,所以乍一看,使用韦恩图(Venn diagrams)来解释这种语法看似合情合理。但是,就像她文章的评论者所说的那样,我在测试中发现韦恩图并不能完与SQL JOINS语法一一对应。尽管如此,但我依然喜欢这个观点,所以让我们看看它是什么原理吧。
假设我们有如下的数据表。左边是表A,右边是表B,每个表中都插入了4条数据。
让我们根据姓名将这些表用不同的方式连接(join)起来,看看是否能够对应于韦恩图。
Inner join(内连接):结果集是A和B的交集
Full outer join(全外连接):结果集是A和B的并集
如果A、B集合的数据不匹配,那么将缺失的那部分数据置为null
Left outer join(左外连接):结果集是A的完全集和B中与A集匹配的那部分数据的并集
B中与A集不匹配的那部分数据置为null
为了得到只在A集中存在,B集中不存在的数据集,我们先使用Left outer join(左外连接),再通过where子句将在B集中显示为null的数据排除
为了得到A、B集独有(unique)数据的并集,我们先使用full outer join(外连接),再通过where子句将两个集合共有的数据排除
文章来源:A Visual Explanation of SQL Joins(需翻墙)
总结:
在关系代数中,连接运算是由一个笛卡尔积运算和一个选取运算构成的。首先用笛卡尔积完成对两个数据集合的乘运算,然后对生成的结果集合进行选取运算,确保只把分别来自两个数据集合并且具有重叠部分的行合并在一起。连接的全部意义在于在水平方向上合并两个数据集合(通常是表),并产生一个新的结果集合,其方法是将一个数据源中的行于另一个数据源中和它匹配的行组合成一个新元组。
SQL提供了多种类型的连接方式,它们之间的区别在于:从相互交叠的不同数据集合中选择用于连接的行时所采用的方法不同