データベースを扱う時、SQLで二つのテーブルからデータを取り出して結合したい時ってありますよね!!
例えば、「AテーブルとBテーブルの結果を結合して出力する」みたいなイメージです。
そんなときは、SQLでは「JOIN」という関数を使うと結合することができるのですが、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があれば結合したい・・・という時
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)
外部結合は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で埋めています。
さいごに
最後まで読んでいただき、ありがとうございました。
もし、記載している内容が間違えていれば遠慮なくコメントしてください!
私自身の勉強になりますし、他の人がこの記事を見た時に間違えた情報を見ることになってしまうので💦
関連記事・オススメ記事
↓オススメ書籍↓
価格:2,860円 |
JavaプログラマGold SE 8 試験番号:1Z0-809 (オラクル認定資格教科書) [ 山本道子(プログラミング) ] 価格:4,620円 |
新人エンジニアのための データベースのしくみと運用がわかる本【電子書籍】[ 五十嵐貴之 ] 価格:2,178円 |