質問: これまで INNER JOIN を一度も使用したことはないのですが、 INNER JOIN は、どういう時に使用するのですか? INNER JOIN を使用しないと、出来ない処理はありますか? --- INNER JOIN の説明を読むと、両テーブルのカラム値が一致するデータだけ取得する、と書いてあるのですが、 OUTER JOIN で、両テーブルのカラム値が一致するという条件を書けば良いだけだと思うのですが、そういう問題ではない?? 例えばですが、OUTER JOIN 後に、条件追記することで INNER JOIN と同じ結果を取得できますか? 実際に実行するかどうかは別として、基本的な考え方としては下記認識で合っていますか? ・INNER JOIN 取得結果から、OUTER JOIN 取得結果を 得ることは不可 ・OUTER JOIN 取得結果から、(条件追記することで)INNER JOIN 取得結果を 得ることは可
回答: INNER JOIN と OUTER JOIN は状況に応じて使い分けるべき、別の演算です。MySQL では何も装飾のない `JOIN` は INNER JOIN になるので、使ったことはあるのではないかと思います。 そもそも、関係データベースの JOIN 演算には次の 4 つの種類が知られています。 * INNER JOIN * LEFT OUTER JOIN * RIGHT OUTER JOIN * FULL OUTER JOIN これらはそれぞれ、対応する値が相手のテーブルに存在しなかったときにどうするか、が異なります。 例として『リレーショナルデータベース入門』(増永良文)に載っていたものを引用します。最初に次のようにふたつのテーブル「供給」と「需要」があったとします。 ! このふたつのテーブルを、`供給.部品 = 需要.部品` という条件のもとでそれぞれ JOIN 演算すると次のようになります。 ! それぞれの演算において相手のテーブルに対応する `部品` があるかないかによって演算結果に特定の行ができるかできないかが変わってくるのがお分かりかと思います。この違いは、この後どのような演算をしたいのかによって これらを理解していただいた上で質問文の質問に答えます。 > > (INNER JOIN を使わずに)OUTER JOIN で、両テーブルのカラム値が一致するという条件を書けば良いだけだと思うのですが、そういう問題ではない?? > > > NULL のある行が生まれるか生まれないかの差異があるので、その条件だと代替はできません。 > > OUTER JOIN 後に、条件追記することで INNER JOIN と同じ結果を取得できますか? > > > はい、無駄を許せば、一度 OUTER JOIN した後、その結果のテーブルに対して `供給.部品 = 需要.部品` な行だけ残るように WHERE 節を書けば実現できます。ただそんなことをするくらいなら最初から INNER JOIN を書けば良いでしょう(もっとも、MySQL だとこのような条件は最適化されて INNER JOIN 相当のクエリになることが多そうですが)。 補足:MySQL には FULL OUTER JOIN 構文は存在しないのでお気をつけください。参考: Why does MySQL report a syntax error on FULL OUTER JOIN?