wataruの部屋

20代駆け出しシステムエンジニア 低学歴な人生を歩んで来たため仕事させてくれる社会に感謝しています。 ブログの内容は映画やプログラミングに関することなど...

<SQL>テーブル結合 

データベースを扱う時、二つのテーブルからデータを取り出して結合したい時ってありますよね。
Joinという関数を使いましょう
あと、INNER JOIN句は結構使いますね...


内部結合

それぞれのテーブルから指定したカラム名の値が一致した箇所だけを結合する結合です。

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があれば結合したい...という時

SELECT * FROM USER_INFO As A
INNER JOIN USER_INFO_LOG As B ON A.USER_ID = B.USER_ID;


この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ではベーステーブルから条件に一致しない箇所は削除されて結果出力します。

外部結合

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

構文は以下

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で埋めています。


まとめ

以上が結合です。
仕事中にまじで意味不明すぎて調べたものをアウトプットしています。間違ってたらすみません....