内连接和外连接(左连接、右连接)有何区别,它们中哪个的性能最好?
谢谢!
不同连接类型的性能比较是无关紧要的,因为它们会给出不同的结果集。即使内连接更快,如果您需要左连接的结果(包括即使在连接中第二个表中没有匹配的记录),您也不会使用内连接。
循环
join
为第一张表中的每一行遍历第二张表中的每一行。如果你有一个非常大的表和一个小得多的表,这是很好的选择。合并
join
按顺序同时遍历两个表。如果两个表都已按你要连接的字段排序,则可能非常快。哈希
join
使用许多临时表来分组输出,因为它对连接数据进行排序。LEFT JOIN B
与B RIGHT JOIN A
是相同的。一些RDBMS没有RIGHT JOIN
,因此您必须将RIGHT JOIN
逻辑重写为LEFT JOIN
逻辑。
A 1 2 3
B 2 3 4 3
SELECT A.I FROM INNER JOIN B ON B.I = A.I;
output: 2 3, 3
SELECT A.I AS X, B.I AS Y FROM A LEFT JOIN B ON B.I = A.I;
read above code as A on LEFT, JOINs B
output:
X Y
1 NULL
2 2
3 3
3 3
SELECT A.I AS X, B.I AS Y FROM B RIGHT JOIN A ON A.I = B.I;
将上面的代码理解为B在右侧,与A结合
。这与A在左侧是一样的。
无论左侧有什么,它总是被评估并始终具有输出。你可以将A LEFT JOIN B、B RIGHT JOIN A想象成:
var result = new Dictionary<int, int?>();
var A = new int[] { 1, 2, 3 };
var B = new int[] { 2, 3, 4, 3 };
foreach (int aElem in A)
{
bool hasMatch = false;
foreach (int bElem in B)
{
if (bElem == aElem)
{
result.Add(aElem, bElem);
hasMatch = true;
}
}
if (!hasMatch)
result.Add(aElem, null);
}
foreach(int X in result.Keys)
{
MessageBox.Show(string.Format("X {0} Y {1}", X, result[X].HasValue ? result[X].Value.ToString() : "NULL" ));
}