web-dev-qa-db-ja.com

SQL結合の違い

内部結合と外部結合(左結合、右結合)の違いは何ですか?どれが最高のパフォーマンスですか?

ありがとう!

41
leo

この記事を確認してください:

SQL結合の視覚的説明

内部結合:

左外部結合:

右外部結合:

77
CMS

結合のタイプ間のパフォーマンス比較は、結果セットが異なるため、重要ではありません。内部結合の方が高速であっても、左結合の結果(結合の2番目のテーブルと一致しないレコードも含む)が必要な場合は使用しません。

4
HLGEM

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が左にあるのと同じです

左側にあるものは常に評価され、常に出力されます。左の結合B、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"  ));
        }
3
Michael Buen

左、右、インナー、アウターはパフォーマンスに影響を与えません。これらはすでにここで十分に説明されています。

ただし、結合に追加してパフォーマンスに影響を与えるヒントがあります。ハッシュ、ループ、マージです。

通常、クエリプランナーがこれらのどれを行うかを決定しますが、場合によっては、それをオーバーライドすることでパフォーマンスを向上させることができます。

A loopjoinは、最初のテーブルの各行について、2番目のテーブルのすべての行を通過します。これは、1つの非常に大きなテーブルと1つの非常に小さなテーブルがある場合に適しています。

A mergejoinは両方のテーブルを順番に処理します。両方のテーブルが、参加しているフィールドによってすでに注文されている場合、それは非常に迅速です。

A hashjoinは、多数の一時テーブルを使用して、結合されたデータをソートするときに出力をグループ化します。

一部の専門DBは、ビットマップ結合などの他のタイプもサポートしています。

3
Keith

うまくいけば、あなたは写真を理解しています。パフォーマンスに関しては、これらは同等です-違いはありません。

編集:おっと。答えのその部分は気にしていなかったと思います。

0
dkretz