SQLのINNER JOINとOUTER JOINの解説をリライトした例
こんにちは。ドキュメント・コンサルタントの開米瑞浩です。
今回は、専門的な知識経験を持った専門家の技術解説をリライトする事例をお見せしましょう。題材がSQLによるRDBアクセスの話なので、SQLに関する基本知識を持った人向きの内容です。
先日書いた「結合条件と抽出条件」の話の続きです。
(といっても技術的にはこちらのほうが先なのですが(^_^;))
まず、元ネタはこちら
↓
FROM句とWHERE句 - SQLer 生島勘富 の日記
http://d.hatena.ne.jp/Sikushima/20100612/1276311628
この中の、「図1 INNER JOIN のイメージ」から 「図4 FULL OUTER JOINのイメージ」までの解説が、やはり技術的には正しいのですが、分かりやすいか? というと少々難がありますので、生島さんの依頼により私がリライトすることにしました。私のほうはDBに関する知識は乏しいのですが、この種の情報を人に通じるように構成するほうは本職です。
この件は実はベン図を使って説明するのには向かないテーマです。「なぜベン図向きでないのか?」の解説は次回にまわし、今回は先にリライト例を紹介します。
以下、書き直したものを掲載します。なお、JOINについての最も基本的な説明(結合条件無しのJOINの働き)は省略しています。
TABLE A と TABLE B を結合条件A.ID = B.A_ID でJOINするとします。
このとき、INNER JOIN と OUTER JOINで結果がどう変わるかを考えてください。(実際は RIGHT JOIN を使うことは少ないのでそちらは省略します。また、LEFT OUTER JOINもOUTERを省略して LEFT JOIN とだけ書くことが多いと思いますが、図では省略せずに載せておきます)
【解答】
INNER JOIN を使うと、A と B でマッチしたものだけが残ります。
上図でグレーにした部分は、IDがマッチしませんのでJOIN結果には残りません。したがって、JOIN結果として得られるのは次のようなデータです。
一方、LEFT OUTER JOIN の場合は、左側に書いたテーブルのデータはすべて残ります。
テーブルB にAとマッチするIDがなくても、Aのレコードはすべて残るため、実際にJOIN結果として得られるのは次のようなデータです。
テーブルBにAとマッチするレコードが存在しない部分については、NULL として結果が得られます。
RIGHT OUTER JOIN ならばこれの右と左が逆になるわけですね。(あまり使われませんが)。
というわけで、なぜこれをINNERとOUTERと呼ぶのか? を視覚的に説明するならば、両テーブルの内側(マッチングの部分)を基準に残すのがINNER JOIN、
マッチングの外側(片方のテーブル)を基準に残すのがOUTER JOINということになります。
以上、ここまでがリライトされた内容です。
一方、元ネタの生島さんのブログでは、集合論でよく使われるベン図を使って説明していました。
こうしたベン図表現での説明は、間違いではないのですが、ある理由で、DB概念の初心者を相手に説明する場合には実は不向きです。ではその理由とは何か? を次回で説明します。