結合と抽出を同時に処理するINNER JOINを、使い難いと感じる方がいるのではないでしょうか。今回は、そのような方のために、INNER JOINの基本と賢い使い方について解説します。
SQLの基本は関連と抽出
SQLの役割をさっくり言ってしまえば、データベースに格納されたデータを関連付けし、さらに条件によって必要なデータを抽出したリストの出力です。SQLを学んだ方なら、SELECT文のFROM句で複数のテーブルを参照し、WHERE句に指定した条件で抽出することをご理解されているでしょう。
しかし、INNER JOINを使えば、SQLの基本とも言えるデータの関連と抽出の両方を一度にできることをご存じでしょうか。まずは、INNER JOINとはどのようなコマンドかについて解説します。
SQLにおける表結合コマンドは5つ
SQLが使えるデータベースは一般的にはリレーショナルデータベースと呼ばれており、格納されたデータの関係を使って複雑な表を作れるのが特徴です。そして、SQLでは、テーブルを結合する方法として、次の5つの機能を
規定しています。
内部結合:INNER JOIN
外部結合(左結合):LEFT OUTER JOIN
外部結合(右結合):RIGHT OUTER JOIN
外部結合(全結合):FULL OUTER JOIN
交差結合:CROSS JOIN
内部結合と外部結合は、中学の数学で使われるベン図で表すと次のような関係になると考えてください。
この図でも解るとおり、今回取り上げるINNER JOINは内部結合であり、2つのテーブルの両方に一致するデータのみを出力する機能です。
関連と抽出を同時にできるINNER JOIN
先ほどご紹介したベン図のように、INNER JOINは、参照する2つのテーブルで両方とも条件に一致するデータのみ結合されます。これは別の見方をすれば、条件に合わないデータは、結合する2つのテーブルから除外される、ということです。
そのためINNER JOINは、結合する2つのテーブルの両方に関連しているデータだけを抽出し、それらを結合するという2つの機能を同時に行う機能としても使えます。そしてINNER JOINの条件を指定するON句の機能は、WHERE句で抽出条件を指定していることと同じ機能として補償されており、WHERE句の代わりとしても利用可能です。
INNER JIONの基本
今回解説しているINNER JOINは、SELECT文のFROM句の次に記述し、2つのテーブルを続くON句の条件で関連付けして結合します。なお、この基本的な文法は次のとおりです。
FROM テーブル1 INNER JOIN テーブル2 ON 結合条件
次に、INNER JOINを使ったSQLの例を紹介します。
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;
この例では、table1とtable2の2つのテーブルを、table1.id = table2.idの条件で結合します。ただし、左側に記述したtable1に格納されたデータでも、table1のidとtable2のidが一致しないデータは出力されません。
INNER JIONの基本的な使い方
先ほどINNER JOINの概要を解説しましたが、その使い方をイメージできない方もおられるでしょう。そのような
方のために、次から具体的なデータを使ってINNER JIONの基本的な使い方を説明します。
INNER JIONの使用例
2つのテーブルを使って、INNER JOINの使い方を解説します。
table1の要素
id 都道府県 地方 フラグ
1 東京 関東 1
2 神奈川 関東 1
3 大阪 近畿 1
4 愛知 中部 1
5 埼玉 関東 1
table2の要素
code 地方 フラグ
101 北海道 1
102 東北 1
103 関東 1
104 中部 1
この2つのテーブルを、「地方」を条件として、INNER JOINを実行すます。この場合、SQLは次のとおりです。
SELECT * FROM table1 INNER JOIN table2 ON table1.地方 = table2.地方;
SQLの実行結果
id 都道府県 地方 フラグ code 地方 フラグ
1 東京 関東 1 103 関東 1
2 神奈川 関東 1 103 関東 1
4 愛知 中部 1 104 中部 1
5 埼玉 関東 1 103 関東 1
このSQLでは、table1の地方とtable2の地方に格納された共通の「関東」のデータが取り出されます。なお、この条件に合うデータは、table1では、都道府県名が「東京」「神奈川」「愛知」「埼玉」の4つで、table2ではcodeが「103」「104」の2つです。そして、それらを結合した結果が、上記のとおりです。
ONには複数の条件が書ける
SQLで使われるON句は、JOINで結合する条件を記述しますが、ANDやORを使うことで複数の条件を記述できます。例えば、次のとおりです。
SELECT * FROM table1 INNER JOIN table2 ON ( table1.地方 = table2.地方 ) AND ( table1.フラグ = table2.フラグ ) ;
WHEREで指定するのと同じ
先ほど、ON句には複数の条件を記述できると解説しましたが、ONには2つのテーブルの関係だけでなく、WHERE句で指定する抽出条件もここに書けます。例えば、次のSQLも記述できます。
そして、このSQLは、次のWHEREを使ったSQLと同じです。次にINNER JOINを使って抽出する例を紹介します。
SELECT * FROM table1 INNER JOIN table2 ON ( table1.地方 = table2.地方 ) AND ( table1.フラグ = 1 );
WHEREで書き換えた例は次のとおりです。
SELECT * FROM table1 INNER JOIN table2 ON table1.地方 = table2.地方 WHERE table1.フラグ = 1 ;
なお、上の例のようにINNER JOINを使うことで、WHEREと同じ抽出条件を書けますが、抽出条件はWHEREで書いておくことが推奨されるケースもあります。両方使えるようにしておきましょう。
INNER JIONを使った応用例
先ほど解説したように、INNER JOINは2つのテーブルを結合し、なおかつ、WHERE句の代わりにON句に抽出条件を記述できるのが特徴です。そして、この機能をうまく利用すれば、副次問い合わせのSELECT文に使うことで、いろいろなメリットが生まれます。次から、INNER JOINを活用した応用例をご紹介します。
副次問い合わせの代わりに使う
SQLでは、既存のテーブルからデータを集めてリストを作る際、入れ子となるSELECT文で作ったリストが利用できます。これは、副次問い合わせと呼ばれ、SQLではよく使われる機能です。
この副次問い合わせには、SELECT文で始まる既存のテーブルから抽出する処理で作ったリストを使いますが、INNER JOINで結合と抽出を同時に実行して作ったリストも同じように利用できます。
テーブル結合の高速化のために使う
多くのデータを格納したテーブル同志を結合するのには、処理効率の良いデータベース管理ソフトを使ったとしても、処理に時間がかかります。さらにそういった大きなテーブルを幾つも結合する場合、処理が遅いと感じることがあるでしょう。
しかし、結合するテーブルのデータを予め少なくしておけば、処理を高速化できます。そのために、活用したいのが、INNER JOINです。INNER JOINでは、テーブルの結合と抽出を同時に処理でき、さらに、抽出したデータのみ結合すれば、処理の高速化が可能です。
次に、OUTER JOINで結合するリストを、INNER JOINで作成する例を紹介します。
SELECT 値1, 値2, 値3, 値4, 値5, 値6 FROM 表1 LEFT OUTER JOIN ( 表2 INNER JOIN ( 表3 INNER JOIN 表4 ON 表3.条件3 = 表4.条件4 ) ON 表2.条件2 = 条件3 ) ON 表1.条件1 = 条件2;
この例では、表1をリストの最も左側に配置し、その右側に、表2、表3、表4を結合します。なお、その際、INNER JOINを使い、表2、表3、表4で条件に合うデータのみ結合したリストを作り、それを結合しています。そのため、予め少ないデータを結合しているので、全て結合してから条件に合わせて抽出するよりも処理
を高速化できます。
INNER JOINを使った効率の良いSQLをマスターしよう
INNER JOINは、SQLのテーブル結合機能の中でも、データの結合と条件抽出を同時に実行するので、使い方が難しいと感じる方も多いでしょう。しかし、うまく組み合わせることで簡潔で、しかも早く処理できるSQLが作れます。
INNER JOINで結合した具体的なリストをイメージし、さらに、他のテーブルと結合するなどして、効率の良いSQLを作れます。ぜひ、今回ご紹介した内容を参考に、INNER JOINの使い方をマスターしてください。
INNER JOINは、結合する2つのテーブルの両方に関連しているデータだけを抽出し、それらを結合するという2つの機能を同時に行います。