SQL连接差异

SQL连接差异,sql,join,Sql,Join,内部联接和外部联接(左联接、右联接)之间有什么区别?哪种联接的性能最好 谢谢 查看这篇文章: 内部联接: 左外连接: 右外部联接: 希望你能理解这些图片。就性能而言,它们是等效的-没有区别 编辑:哎呀。我猜你不在乎答案的那一部分。A左连接B与B右连接A相同。一些RDBMS没有右连接,因此您必须将右连接逻辑重写为左连接逻辑 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
左连接B
B右连接A
相同。一些RDBMS没有
右连接
,因此您必须将
右连接
逻辑重写为
左连接
逻辑

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一样

无论左边是什么,都会被计算,总是有一个输出。您可以将左连接B、右连接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"  ));
        }
var result=newdictionary();
var A=新的int[]{1,2,3};
VarB=新的int[]{2,3,4,3};
foreach(A中的int-aElem)
{
bool-hasMatch=false;
foreach(B中的int-bElem)
{
if(bElem==aElem)
{
结果。添加(aElem、bElem);
hasMatch=true;
}
}
如果(!hasMatch)
result.Add(aElem,null);
}
foreach(result.Keys中的int X)
{
Show(string.Format(“X{0}Y{1}”,X,结果[X].HasValue?结果[X].Value.ToString():“NULL”);
}

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

左侧、右侧、内部和外部都不会影响性能,这里已经对它们进行了很好的解释

不过,您可以向连接中添加一些影响性能的提示:哈希、循环和合并

通常情况下,查询计划器决定执行哪项操作,但偶尔您可以通过覆盖它来提高性能

循环
联接
针对第一个表中的每一行遍历第二个表中的每一行。如果你有一张很大的桌子和一张小得多的桌子,这很好

合并
联接
按顺序同时遍历两个表。如果两个表都已按要加入的字段排序,则可以非常快地完成

散列
联接
在对联接数据进行排序时,使用大量临时表对输出进行分组


一些专业DBs还支持其他类型,如位图联接。

问题的第2部分是关于性能的,它不一定与联接方法直接相关,您对此有任何进一步的评论吗?请务必阅读本文中的所有评论,因为它将联接表示为集合操作是非常关键的!例如,左连接不是交集,因为它会创建新的元组。如果图中还显示了完整的外部连接,则效果会更好。由于不同类型的联接产生不同的结果,因此性能问题有些无关紧要。您应该选择产生所需结果的一个。性能取决于DBMS的内部。完整的外部连接只是两个圆的整体,所以它真的需要用图表表示吗?