在日常开发工作中,我们经常使用表连接,因为表连接具有较好的查询效率,我们知道全连接后的表和笛卡尔积有关系。但是对于笛卡尔积的特点理解甚少,这篇文章对笛卡尔积的特性做一下分析。
假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}。
在这个简单的实例中,集合A和集合B并没有相同字段。明显和数据库表的全连接有差异。
在数据库中tableA连接tableB如下:
tableA:
1 1
2 2
3 2
4 3
tableB:
2 1
2 2
3 3
3 4
tableA连接tableB,使用A的第二行,B的第一行全连接:
1 1 null
2 2 1
2 2 2
3 2 1
3 2 2
4 3 3
4 3 4
我们忽略掉含有null的行(定义为无效连接),会发现剩下的行等于:(tableA含有2,3字段的行数) × (tableB含有2,3的均值) = 3 × 2 = 6;
做以下粗略分析:假设a=b=1,其中a表示tableA的第二行,b表示tableB的第一行。
则不含null总行数可以采取如下计算获得:
2在A表第二行出现的次数 × 2在B表第一行出现的次数 + 3在A表第二行出现的次数 × 3在B表第一行出现的次数 = (2 × a× b× 2 )+ (1 × a× b× 2) = 6 = (2a + 1a) × ((2b + 2b)/(1+1))
易观察到 (2a + 1a) 的含义是(tableA含有2,3字段的行数)。 ((2b + 2b)/(1+1))的含义是(tableB含有2,3的总行数/非重复值的个数),即(tableB含有2,3的均值)。多个字段连接时也具有这个特点。
正式表述为:AB全表连接有效连接的个数等于连接值在A表的出现次数乘以在在B表中出现次数的均值。严格证明从略。
之所以这样表述,是因为,在工作中,我们很容易知道连接值在A表的出现次数和B表中出现次数的均值(比如山东有几个地级市,每个地级市大约有多少人),这样就可以估算全连接后表的大小了。