SQL加入差异

时间:2009-01-07 06:18:27

标签: sql join

内连接和外连接(左连接,右连接)之间有什么区别,哪个具有最佳性能?

谢谢!

5 个答案:

答案 0 :(得分:77)

查看这篇文章:

A Visual Explanation of SQL Joins

内部加入:

左外连接:

正确的外部加入:

答案 1 :(得分:4)

连接类型之间的性能比较无关紧要,因为它们提供了不同的结果集。即使内部联接更快,如果您需要左联接的结果(甚至包括与联接中的第二个表不匹配的记录),也不会使用它。

答案 2 :(得分: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 on RIGHT, JOINs A。这与A在LEFT上的相同

无论左边是什么,总是被评估,总是有输出。您可以想象A LEFT JOIN B,B RIGHT JOIN A as:

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

答案 3 :(得分:3)

左,右,内,外不影响表现,这里已经很好地解释了它们。

但是,有些提示可以添加到影响性能的连接中:哈希,循环和合并。

通常,查询计划程序会决定执行哪些操作,但有时您可以通过覆盖它来提高性能。

loop join遍历第二个表格中第一行中每一行的每一行。如果你有一个非常大的桌子和一个小得多的桌子,这是很好的。

merge join按顺序一起浏览两个表。如果两个表已经按您加入的字段排序,则可以非常快。

hash join使用大量临时表对输出进行分组,因为它会对已连接的数据进行排序。

某些专业数据库还支持其他类型,例如位图连接。

答案 4 :(得分:0)

希望你能理解这些照片。在性能方面,它们是等效的 - 没有区别。

编辑:哎呀。猜猜你不关心那部分答案。