【データベース】SQLでテーブル結合をするやり方を解説!(外部結合と内部結合について)

f:id:koko55120:20220117170608j:plain
データベースを扱う時、SQLで二つのテーブルからデータを取り出して結合したい時ってありますよね!!
例えば、「AテーブルとBテーブルの結果を結合して出力する」みたいなイメージです。


そんなときは、SQLでは「JOIN」という関数を使うと結合することができるのですが、JOINという関数には「内部結合」と「外部結合」という概念があります。


今回は、現場業務で調べた「内部結合」と「外部結合」のそれぞれについて解説していこうと思います!

内部結合について(INNER JOIN)

f:id:koko55120:20220117151443j:plain

内部結合は、INNER JOIN句を使用します。
これは、それぞれのテーブルから「指定したカラム名の値が一致した箇所だけ」を結合する結合です。
では、構文を下記で解説していきます。

構文

SELECT カラム名1,カラム名2, .... FROM テーブル名1
INNER JOIN テーブル名2 ON 結合する条件


上記の文で行っていることは、テーブル名1からカラム名1とカラム名2を取り出す
テーブル名2から テーブル名1と指定したカラム名が一致すればテーブル名1に結合しなさい。
という処理です。


具体的に説明しましょう。
以下のテーブルがあったとします。


USER_INFO

USER_NAME USER_ID CONFIG
wata A001 プロパー
koji B001 派遣
hoge C001 契約

USER_INFO_LOG

USER_ID FIXED_DAY
A001 YYYY/MM/DD
B001 YYYY/MM/DD
D001 YYYY/MM/DD

このテーブルに対して、USER_INFOテーブルから値を取り出してUSER_INFO_LOGから同じUSER_IDがあれば結合したい・・・という時
INNER JOINを使ってSQL組んでみます。

SELECT * FROM USER_INFO As A
INNER JOIN USER_INFO_LOG As B ON A.USER_ID = B.USER_ID;</b>

このSQLを流すと・・・

USER_NAME USER_ID CONFIG USER_ID FIXED_DAY
wata A001 プロパー A001 YYYY/MM/DD
koji B001 派遣 B001 YYYY/MM/DD

と返されます。これは、USER_INFOのA001とB001がUSER_INFO_LOGのUSER_IDと一致するため結合される。

注目すべき点は、C001が無いこと。
INNER JOINではベーステーブルから条件に一致しない箇所は削除されて結果出力します。

外部結合について(OUTER JOIN)

f:id:koko55120:20220117144331j:plain

外部結合はOUTER JOIN句を使用します。
内部結合と同様にそれぞれのテーブルの指定したカラムの値が一致するものを結合するの加え
外部結合は、どちらかのテーブルにしか存在しないものも取得する。


構文は以下の通りです。

SELECT カラム名1,カラム名2, ...FROM テーブル名1
LEFT(RIGHT) OUTER JOIN テーブル名2 ON 結合の条件


LEFTとRIGHTとは何ぞやと・・・


LEFT OUTER JOIN → 左側のテーブルを軸にして外部結合
RIGHT OUTER JOIN → 右側のテーブルを軸にして外部結合


要はON句でどっちを基準にするかという話です。
具体的に書いてみます。


まずは、左から LEFT OUTER JOIN

SELECT * FROM USER_INFO AS A
LEFT OUTER JOIN USER_INFO_LOG ON A.USER_ID = B.USER_ID


以下になります。

USER_NAME USER_ID CONFIG USER_ID FIXED_DAY
wata A001 プロパー A001 YYYY/MM/DD
koji B001 派遣 B001 YYYY/MM/DD
hege C001 派遣 NULL NULL


当然左を基準とするため、USER_INFOテーブルの値はすべて出力されます。
3行目です。NULLとなっている箇所はUSER_INFO_LOGで一致していない箇所になります。

OUTER JOINはINNER JOINと違って切り捨てません。
一致しない場合は結合相手のところをNULLで埋めます。



次です。RIGTH OUTER JOIN

SELECT * FROM USER_INFO AS A
RIGHT OUTER JOIN USER_INFO_LOG ON A.USER_ID = B.USER_ID
USER_NAME USER_ID CONFIG USER_ID FIXED_DAY
wata A001 プロパー A001 YYYY/MM/DD
koji B001 派遣 B001 YYYY/MM/DD
NULL NULL D001 YYYY/MM/DD

3行目はUSER_INFO_LOGと一致しない箇所をNULLで埋めています。

さいごに

最後まで読んでいただき、ありがとうございました。

もし、記載している内容が間違えていれば遠慮なくコメントしてください!
私自身の勉強になりますし、他の人がこの記事を見た時に間違えた情報を見ることになってしまうので💦