SQLSERVER テーブル 内部結合 外部結合

今回は、テーブルの結合について紹介していきます。
テーブルの結合には、INNER JOIN 、LEFT OUTER JOIN 、RIGHT OUTER JOIN 、CROSS JOIN の4種類の方法がありますので、
この4つの結合について見ていきましょう。

そもそも結合とは、どういう時に使用するかというと、複数のテーブルの項目を取得したい時に使用します。
複数のテーブルを指定した項目で紐づけて、1つの大きなテーブルとして使用するイメージです。

2つのテーブルを用意したので、このテーブルを4種類の結合方法で結合して、結果を見ていきます。

UserMst

id personalName sportId
1 すずき 3
2 さとう 1
3 たなか 2
4 かとう 6

 

SportMst

sportId sportNm
1 野球
2 サッカー
3 バスケット
4 ラグビー
5 バレー

 

内部結合(INNER JOIN)

INNER JOIN

まずは、INNER JOIN(内部結合)と呼ばれる結合方法を例を見ながら、見てみましょう。

INNER JOIN(内部結合)は、指定した項目で紐づけた時、一致した行のみを表示する結合方法です。

例を見るとわかりやすいと思います。
先ほどの2つのテーブル「UserMst、SportMst」を指定した項目「sportId」で結合してみます。

2つの表を合体させた イメージ

id personalName SportId SportId sportNm
1 すずき 3 3 バスケット
2 さとう 1 1 野球
3 たなか 2 2 サッカー
4 かとう 6
4 ラグビー
5 バレー

 

上の3行は、うまく結合できましたが、下の3行はうまく結合できないのがわかりますね。
内部結合の場合は、うまく結合できた部分だけ表示を行います。

SELECT
  id
 ,personalName
 ,UserMst.sportId
 ,sportMst.sportId
 ,sportMst.sportNm
FROM
  UserMst

INNER JOIN SportMst
ON UserMst.sportId = SportMst.sportId

 

SQLSERVERでのINNER JOIN の書き方

INNER JOIN テーブル名
ON 紐づける項目 = 紐づける項目

 

結果

「sportId:1、2、3」は両方のテーブルに存在しますが、それ以外の「sportId:4、5、6」は、どちらか片方のテーブルにしか存在していません。
2つのテーブルで一致する行のみ表示されており、一致しなかった行は表示されません。
これがINNER JOINの特徴です。

 

外部結合(LEFT OUTER JOIN 、RIGHT OUTER JOIN)

LEFT OUTER JOIN

続いて、LEFT OUTER JOIN(外部結合)と呼ばれる結合方法を見ていきましょう。

LEFT OUTER JOIN(外部結合)は、メインのテーブルを選択し、そのテーブルに対して、一致するデータを紐づける、ただし一致しない場合でも空で表示される。
つまり、行数はメインで選択したテーブルの件数から変わらないのが特徴となっています。

例を見ていきましょう。

2つの表を合体させた イメージ UserMstをメインテーブル

id personalName SportId SportId sportNm
1 すずき 3 3 バスケット
2 さとう 1 1 野球
3 たなか 2 2 サッカー
4 かとう 6

 

SQLSERVERでのLEFT JOIN の書き方

LEFT OUTER JOIN テーブル名
ON メインテーブル.項目 = 紐づけテーブル.項目

 

SELECT
  id
 ,personalName
 ,UserMst.sportId
 ,sportMst.sportId
 ,sportMst.sportNm
FROM
  UserMst

LEFT OUTER JOIN SportMst
ON UserMst.sportId = SportMst.sportId

結果

LEFT OUTER JOIN は、基準となるテーブルを左側に記載する必要があります。今回の例の場合は、
ON UserMst.sprtId = SportMst.sportId
となっているので、左側がUserMstですね。

このデータにSportMstを紐づけています。
「sportId:1、2、3」はSportMstに存在するので、SportIdとSportNmの値が取得できています。
一方「sportId:6」はSportMstに存在しない値なので、NULLが表示されています。
内部結合の場合、一致しない時は行ごと表示しないようにしていましたが、
外部結合の場合、一致しない時は行は表示して、データをNULLにして表示します。

 

RIGHT OUTER JOIN

RIGHT OUTER JOINは、LEFT OUTER JOIN とほぼ同じなので、あまり私は使用しません。
基本的には、LEFT OUTER JOIN を使用していますが、簡単に説明しておきます。

2つの表を合体させた イメージ SportMstをメインテーブル

id personalName SportId SportId sportNm
1 すずき 3 3 バスケット
2 さとう 1 1 野球
3 たなか 2 2 サッカー
4 ラグビー
5 バレー

 

SQLSERVERでのRIGHT OUTER JOIN の書き方

RIGHT OUTER JOIN テーブル名
ON 紐づけテーブル.項目 = メインテーブル.項目

 

SELECT
  id
 ,personalName
 ,UserMst.sportId
 ,sportMst.sportId
 ,sportMst.sportNm
FROM
  UserMst

RIGHT OUTER JOIN SportMst
ON UserMst.sportId = SportMst.sportId

結果

スポーツマスタは、5行あり、「sportId:1、2、3」はUserMstと紐づいている,「sportId:4、5」はUserMstと紐づいていないですね。

LEFT OUTER  JOINとRIGHT OUTER JOIN はほぼほぼ同じなので、LEFT OUTER JOIN をおすすめします。

 

CROSS JOIN

最後にCROSS JOINについて説明していきます。

CROSS JOINは、わかりやすく、結合する際に全てのパターンを網羅し、1行1行結合します。

なので、今回のように4行のテーブル(UserMst)と5行のテーブル(SportMst)をCROSS JOINすると4×5=20行のテーブルになります。

SQLを見てみましょう。CROSS JOINの書き方

CROSS JOIN テーブル名

CROSS JOINは、ONで項目を紐づける必要はありません。

SELECT
  id
 ,personalName
 ,UserMst.sportId
 ,sportMst.sportId
 ,sportMst.sportNm
FROM
  UserMst

CROSS JOIN SportMst

結果

結果を見るのが一番わかりやすいと思いますが、1行ずつ全てのパターンで結合されているのがわかりますね。
4×5で20行のデータができているのが確認できました。

 

まとめ

今回は結合について紹介していきましたが、まずはINNER JOIN と LEFT OUTER JOINを優先して勉強しましょう。
この2つを使うことが圧倒的に多いと思います。

内部結合(INNER JOIN)の場合、一致しない時は行ごと表示しない
外部結合(LEFT OUTER JOIN)の場合、一致しない時は行は表示し、データをNULLにして表示

結合を理解できると、SQLの幅がかなり広がるので是非理解を深めてみてください。

 

SQLServerの記事一覧

おすすめの記事