SQL连接的区别

44

内连接和外连接(左连接、右连接)有何区别,它们中哪个的性能最好?

谢谢!

5个回答

80

请查看这篇文章:

SQL Join的可视化解释

内连接(Inner Join):

左外连接(Left Outer Join):

右外连接(Right Outer Join):


问题的第二部分涉及性能,这与连接方法不一定直接相关,您对此有进一步的评论吗? - Greg Domjan
请务必阅读文章中的所有评论,因为它将连接操作呈现为集合操作是极易受到批评的!例如,左连接并不是一个交集,因为它会创建新的元组。 - bortzmeyer
1
如果图表还显示了FULL OUTER JOIN,那就更好了。由于不同类型的连接产生不同的结果,因此性能问题有些无关紧要。您应该选择产生所需结果的连接类型。性能取决于DBMS的内部。 - Walter Mitty
1
一个FULL OUTER JOIN只是两个圆的全部内容,所以它真的需要被绘制成图表吗? - Powerlord

4

不同连接类型的性能比较是无关紧要的,因为它们会给出不同的结果集。即使内连接更快,如果您需要左连接的结果(包括即使在连接中第二个表中没有匹配的记录),您也不会使用内连接。


3
左、右、内和外连接对性能没有影响,并且已经在这里进行了很好的解释。
然而,你可以添加到连接中的提示会影响性能:哈希、循环和合并。
通常查询计划器决定使用哪种方法,但有时你可以通过覆盖它来提高性能。
一个循环join为第一张表中的每一行遍历第二张表中的每一行。如果你有一个非常大的表和一个小得多的表,这是很好的选择。
一个合并join按顺序同时遍历两个表。如果两个表都已按你要连接的字段排序,则可能非常快。
一个哈希join使用许多临时表来分组输出,因为它对连接数据进行排序。
一些专业的数据库也支持其他类型,如位图连接。

3

LEFT JOIN BB 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"  ));
        }

0
希望你能理解这些图片。就性能而言,它们是等效的 - 没有区别。
编辑:哎呀。看来你不在意答案的那部分。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接