Oracle『内部結合の使い方』テーブルを結合して共通のデータを取得する

Oracle『内部結合の使い方』テーブルを結合して共通のデータを取得するOracle SQL入門

内部結合とは?

内部結合とは、複数のテーブルを結合して共通データを抽出する為の構文です。

前回お話した外部結合では、主となるテーブルに付加情報として
他のテーブルをくっつけるイメージでしたが、

内部結合は、テーブルにあるデータをフィルタリングして
必要なデータのみに絞り込む
というイメージです。

 名探偵

例えば、テーブル1とテーブル2を内部結合する時、
取得するデータ範囲を図で表すと以下のようになります。

Oracle_INNER_JOINのデータ取得範囲

円と円が重なる部分、つまり、共通部分のみ取得するので、
いずれか片方が主になるのではなく、どちらのテーブルも同一レベルで主となります。

内部結合の書き方(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_NOCHAR(1)1
出席番号STUDENT_NONUMBER(3)2
名前NAMEVARCHAR2(30)
【表1】STUDENTテーブルの定義
クラス出席番号名前
11ジョニー
12ボビー
13カレン
21デキスギ
22ノビタ
【表2】STUDENTテーブルのデータ

次に、CLUBテーブルです。
1組の出席番号2のデータはあえて用意しません。

論理名物理名データ型主キー
クラスCLASS_NOCHAR(1)1
出席番号STUDENT_NONUMBER(3)2
部活CLUBVARCHAR2(30)
【表3】CLUBテーブルの定義
クラス出席番号部活
11サッカー
13テニス
21サッカー
22射撃
23野球
【表4】CLUBテーブルのデータ

この時、生徒テーブルと部活動テーブルのどちらにも情報を持っている
データを取得
するには、以下のように内部結合を使うことで実現できます。

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

実行結果は以下です。

Oracle_INNER_JOINの実行結果

結合キーが一致するデータが相手のテーブルに存在しなかった
以下の2つのデータは取得対象から除外
されているのがわかります。

・生徒テーブルの「ボビー」のデータ

・部活動テーブルの「野球」のデータ

このように、内部結合を使うと、値が登録されているデータのみを
絞り込んでSELECTすることができます。

内部結合 まとめ

Oracleの内部結合について以下説明しました。

・内部結合について

・内部結合の書き方

・WHERE句を使って内部結合する方法

・内部結合の使い方

内部結合は外部結合と同じく、SQLを書く際に必須となる構文です。

また、結合キーを誤って指定すると、データを重複して取得してしまったり、
必要なデータが取得できていないなど、不具合の原因となるので、

テーブルの関係性と中に入っているデータの状況を
しっかり把握してから結合キーを決める
ようにしましょう。

内部結合と外部結合を組合せれば、おおよその必要データは取得できるので、
テーブル結合の仕組みを理解して使いこなせるようにしておきましょう!