【本サイトではGoogleアドセンス、または、アフィリエイト広告を利用しています。】
内部結合とは?
内部結合とは、複数のテーブルを結合して共通データを抽出する為の構文です。
前回お話した外部結合では、主となるテーブルに付加情報として他のテーブルをくっつけるイメージでしたが、
内部結合は、テーブルにあるデータをフィルタリングして必要なデータのみに絞り込むというイメージです。
例えば、テーブル1とテーブル2を内部結合する時、取得するデータ範囲を図で表すと以下のようになります。
円と円が重なる部分、つまり、共通部分のみ取得するので、
いずれか片方が主になるのではなく、どちらのテーブルも同一レベルで主となります。
内部結合の書き方(INNER JOIN)
内部結合をする時は以下のようにSQLを書きます。
SELECT
[テーブル名1 or 2].[カラム名]
, ・・・
FROM
[テーブル名1]
INNER JOIN [テーブル名2]
ON [結合キー(テーブル1の任意のカラム1)] = [結合キー(テーブル2の任意のカラム1)]
AND [結合キー(テーブル1の任意のカラム2)] = [結合キー(テーブル2の任意のカラム2)]
AND ・・・
WHERE
・・・
ORDER BY
・・・
内部結合には、外部結合の時のように種類はなく、「INNER JOIN」としてテーブル同士を結合します。
また、テーブル名にはエイリアスも使えるので、テーブル名の指定でSQLが読みにくくなる時は使っていきましょう。
WHERE句に結合条件を指定して内部結合する方法
INNER JOINを使わずに、WHERE句に結合条件を指定することでも、テーブルを内部結合することができます。
SELECT
[テーブル名1 or 2].[カラム名]
, ・・・
FROM
[テーブル名1]
, [テーブル名2]
WHERE
[結合キー(テーブル1の任意のカラム1)] = [結合キー(テーブル2の任意のカラム1)]
AND [結合キー(テーブル1の任意のカラム2)] = [結合キー(テーブル2の任意のカラム2)]
AND ・・・
ORDER BY
・・・
ただし、この書き方は、データの絞り込み条件と混同してしまい可読性やメンテナンス性が下がってしまう為、
SQL構文の都合などでどうしても必要な時だけ使うようにして、
基本的には「INNER JOIN」を使って内部結合しましょう。
内部結合の使い方
内部結合の使い方について、以下のサンプルを使って説明します。
生徒(STUDENT)テーブルと、部活動(CLUB)テーブルがあり、以下のようなデータが入っているとします。
まずはSTUDENTテーブルです。
2組の出席番号3のデータはあえて用意しません。
論理名 | 物理名 | データ型 | 主キー |
---|---|---|---|
クラス | CLASS_NO | CHAR(1) | 1 |
出席番号 | STUDENT_NO | NUMBER(3) | 2 |
名前 | NAME | VARCHAR2(30) |
クラス | 出席番号 | 名前 |
---|---|---|
1 | 1 | ジョニー |
1 | 2 | ボビー |
1 | 3 | カレン |
2 | 1 | デキスギ |
2 | 2 | ノビタ |
次に、CLUBテーブルです。
1組の出席番号2のデータはあえて用意しません。
論理名 | 物理名 | データ型 | 主キー |
---|---|---|---|
クラス | CLASS_NO | CHAR(1) | 1 |
出席番号 | STUDENT_NO | NUMBER(3) | 2 |
部活 | CLUB | VARCHAR2(30) |
クラス | 出席番号 | 部活 |
---|---|---|
1 | 1 | サッカー |
1 | 3 | テニス |
2 | 1 | サッカー |
2 | 2 | 射撃 |
2 | 3 | 野球 |
この時、生徒テーブルと部活動テーブルのどちらにも情報を持っているデータを取得するには、
以下のように内部結合を使うことで実現できます。
SELECT
ST.CLASS_NO
, ST.STUDENT_NO
, ST.NAME
, CL.CLUB
FROM
STUDENT ST
INNER JOIN CLUB CL
ON ST.CLASS_NO = CL.CLASS_NO
AND ST.STUDENT_NO = CL.STUDENT_NO
ORDER BY
ST.CLASS_NO
, ST.STUDENT_NO
実行結果は以下です。
結合キーが一致するデータが相手のテーブルに存在しなかったデータは取得対象から除外されているのがわかります。
このように、内部結合を使うと、値が登録されているデータのみを絞り込んでSELECTすることができます。
内部結合 まとめ
Oracleの内部結合について以下説明しました。
内部結合は外部結合と同じく、SQLを書く際に必須となる構文です。
また、結合キーを誤って指定すると、データを重複して取得してしまったり、
必要なデータが取得できていないなど、不具合の原因となるので、
テーブルの関係性と中に入っているデータの状況をしっかり把握してから結合キーを決めるようにしましょう。
内部結合と外部結合を組合せれば、おおよその必要データは取得できるので、
テーブル結合の仕組みを理解して使いこなせるようにしておきましょう!