内连接、外连接、左连接、右连接有什么区别?

问题描述 投票:0回答:5

内连接、外连接、左连接和右连接有什么区别?哪一款性能最好?

sql join
5个回答
80
投票

查看这篇文章:

SQL 连接的直观解释

内连接:

左外连接:

右外连接:


4
投票

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


3
投票

A

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 on RIGHT, JOINs 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"  ));
        }

3
投票

左、右、内、外不影响性能,这里已经解释得很清楚了。

但是,您可以向连接添加一些会影响性能的提示:散列、循环和合并。

通常,查询规划器决定执行其中哪一项,但有时您可以通过覆盖它来提高性能。

A

loop
join
针对第一个表中的每一行遍历第二个表中的每一行。如果您有一张很大的桌子和一张小得多的桌子,这很好。

A

merge
join
按顺序一起浏览两个表。如果两个表都已按您要加入的字段排序,那么速度会非常快。

A

hash
join
在对连接数据进行排序时使用大量临时表对输出进行分组。

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


0
投票

希望您能理解这些图片。在性能方面,它们是相当的 - 没有区别。

编辑:哎呀。我猜你并不关心答案的这一部分。

© www.soinside.com 2019 - 2024. All rights reserved.