JOINとINNER JOINの違い


999

これらの結合はどちらも同じ結果になります。

SELECT * FROM table JOIN otherTable ON table.ID = otherTable.FK

SELECT * FROM table INNER JOIN otherTable ON table.ID = otherTable.FK

パフォーマンスなどのステートメントに違いはありますか?

異なるSQL実装間で異なりますか?


2
この質問を参照してください:< stackoverflow.com/questions/448023?sort=newest >
Joel Coehoorn

6
補足として、CROSS JOINは結合タイプを知るのに役立ちます(これはINNER JOINとは異なります)。
セルジュ

回答:


1093

これらは機能的には同等ですがINNER JOIN、特にクエリに他の結合タイプ(LEFTまたはRIGHTorまたはCROSS)が含まれている場合は、少し読みやすくなります。


11
これはすべてのデータベース(SQL、postgresなど)に当てはまりますか?これを説明するドキュメントへのリンクを知っている人はいますか?
Chogg


14
クエリは、JOINと書くだけで十分明確です。INNERは単なるノイズです。
Ivanzinho

22
たぶん私は純粋主義者かもしれませんが、SQLを書くときは暗黙よりも明示的である方がよいと思います。INNER JOINは、特に複雑なクエリでより読みやすくなっています。
bruceskyaus

3
@Ivanzinho:キーボードストロークは、クエリやプログラムの複雑さの尺度ではありません。実生活の複雑さは、可読性が大きな役割を果たす保守性に起因します。INNER JOINと表示されている場合は、それが何をするかを確信でき、それはそれだけであるはずですが、プレーンなJOINは、ユーザーまたは他の誰かを離れ、標準が実装について何を言っているのかと疑問に思っています。 / OUTER / LEFTは、偶然または目的によって除外されました。
Tuukka Haapaniemi

243

いいえ、違いはありません、純粋な構文糖


22
私はこの構文糖とは呼びません。「デフォルト」の結合タイプ、「省略形」、「エイリアス」など。
mk12

62
コンピュータサイエンスでは、シンタックスシュガーとは、物事を読みやすくしたり表現したりできるように設計されたプログラミング言語内の構文です。除外する能力はINNERこの定義に該当すると私は信じています。
Quassnoi

14
定義を文字通り非常に文字通りに適用する場合は、そうですが、代替名だけではなく、より興味深いタイプの構文のために予約されているのを見てきました。
mk12 2015年

10
@Quassnoiは、この質問が行われるという単なる事実は、その不在がクエリを読みやすくINNERないことを示しています。私が知っているすべての人にとって、ここでの回答によってそれが解決されなかった場合、それはJOINよく意味するかもしれLEFT JOINません。
martennis 2017年

2
@Quassnoiあなたのコメントで引用された導入ウィキのステートメントは、構文糖については真実ですが、定義としては不十分です。構文シュガーとは、複雑な構文の特殊なケースのためのより単純な構文に関するものです。INNERは「ノイズワード」であると言う方が適切です。
philipxy

143

INNER JOIN = JOIN

JOIN という単語を使用するときにタイプを指定しない場合は、INNER JOINがデフォルトです

LEFT OUTER JOINまたはRIGHT OUTER JOINを使用することもできます。この場合、OUTERという単語はオプションですが、CROSS JOINを指定することもできます。

または

内部結合の場合、構文は次のとおりです。

SELECT ...
FROM TableA
[INNER] JOIN TableBを選択します

(言い換えると、「INNER」キーワードはオプションです -結果はそれがあってもなくても同じです



54

同様OUTER JOINsに、単語"OUTER"はオプションです。それはだLEFTRIGHT作るキーワードJOINANを"OUTER" JOIN

しかし、何らかの理由で私はいつも使用して"OUTER"のようにLEFT OUTER JOIN、決してLEFT JOIN、私は使ったことがないINNER JOINのではなく、私はちょうど使用します"JOIN"

SELECT ColA, ColB, ...
FROM MyTable AS T1
     JOIN MyOtherTable AS T2
         ON T2.ID = T1.ID
     LEFT OUTER JOIN MyOptionalTable AS T3
         ON T3.ID = T1.ID

23
私はあなたの反対です。私は常に "INNER JOIN"と言いますが、OUTERは決して使用しません。「LEFT JOIN」と「RIGHT JOIN」です。文字数を一定に保つだけだと思います!
スティーブンホルト

10
@ジョナサン内部結合には方向の概念はありません。外部結合は、一致しない結果セットを生成する可能性があり、それらは方向に基づいて異なる可能性があります。内側はマッチングが必要なので、方向は関係ありません。
Karl Kieninger、2015年

32

他の答えはすでに述べているように、あなたの例に違いはありません。

文法の関連するビットはここに文書化されています

<join_type> ::= 
    [ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
    JOIN

すべてがオプションであることを示します。このページでは、

INNER一致するすべての行のペアが返されることを指定します。両方のテーブルから一致しない行を破棄します。結合タイプが指定されていない場合、これがデフォルトです

文法はまた、INNER 必要な場合があることを示しています。結合ヒントを指定する場合。

以下の例をご覧ください

CREATE TABLE T1(X INT);
CREATE TABLE T2(Y INT);

SELECT *
FROM   T1
       LOOP JOIN T2
         ON X = Y;

SELECT *
FROM   T1
       INNER LOOP JOIN T2
         ON X = Y;

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.