【図解】SQLでJOINを使う方法(OUTER・LEFT・RIGHT)

目次

JOINとは?

JOINを簡単に説明すると、テーブルとテーブルを結合することです。
あるキーを用いて、複数のテーブルを結合してあげます。

例えば、以下のような社員の所属部署が格納されたテーブルと
社員それぞれの年齢が格納されたテーブルがあるとします。

所属部署

社員ID 社員名 部署
1 田中 営業
2 山田 営業
3 清水 経理
4 高橋 経理
5 岩井 人事
6 村田 人事

社員の年齢

社員ID 社員名 年齢
1 田中 24
2 山田 35
3 清水 40
4 高橋 50
5 岩井 33
6 村田 29



結合してみる

結合するためには、結合キーが必要になります。
今回で言うと”社員ID”が結合するためのキーになります。

f:id:gotto50105010:20181221233321p:plain

上の画像のように、"社員ID"を結合のキーとして用います。
こうすることで、2つのテーブルを結合し、1つのテーブルにすることができます。

JOINのSQLクエリ

イメージは、図解したとおりになりますが、
実際のSQLクエリは、どのようになるでしょうか。

今回の社員IDをキーとして、部署と年齢のテーブルを結合してみたいと思います。

SELECT
    所属部署.社員ID,
    所属部署.社員名,
    所属部署.部署,
    社員の年齢.年齢
FROM
    所属部署
JOIN
    社員の年齢
ON
    所属部署.社員ID = 社員の年齢.社員ID

実行結果

社員ID 社員名 部署 年齢
1 田中 営業 24
2 山田 営業 35
3 清水 経理 40
4 高橋 経理 50
5 岩井 人事 33
6 村田 人事 29

さて、結合した結果はこのようになりました。
バラバラのテーブルに存在していた所属部署と社員の年齢のデータが、
1つのテーブルに格納されましたね。

このように、SQLを用いてテーブルを結合することができます。
結合にもいくつかの種類があるので、それぞれを説明していきたいと思います。

(INNER) JOIN

INNER JOIN(内部結合)は、それぞれのテーブルに
指定したキーが一致するものだけを結合します。

言葉ではなく、図を用いて説明していきましょう。

f:id:gotto50105010:20181221233420p:plain

INNER JOINのクエリ

SELECT
    所属部署.社員ID,
    所属部署.社員名,
    所属部署.部署,
    社員の年齢.年齢
FROM
    所属部署
(INNER)JOIN ※INNERは、書いても書かなくても同じ
    社員の年齢
ON
    所属部署.社員ID = 社員の年齢.社員ID

この一部分だけキーが存在するテーブルを結合すると、
一致しない部分は消えてしまい、結合できた部分だけ残ります。

実行結果

社員ID 社員名 部署 年齢
1 田中 営業 24
3 清水 経理 40
4 高橋 経理 50
5 岩井 人事 33

ポイント

  • INNER JOINは、結合キーが一致するもののみ結合される
  • 結合キーが一致しないものは、消えてしまう

LEFT JOIN

これは、文字通り「左側のテーブルに結合する」という意味です。
INNER JOINとの違いは、左側のテーブルをベースにするので、
キーが一致しない場合でも、左側のテーブルに存在する値は残ります。

早速、言葉よりも図でご説明しましょう。

f:id:gotto50105010:20181221233503p:plain

f:id:gotto50105010:20181221233527p:plain

LEFT JOINのクエリ

SELECT
    社員の年齢.社員ID,
    社員の年齢.社員名,
    社員の年齢.年齢,
    所属部署.部署
FROM
    社員の年齢
LEFT JOIN
    所属部署
ON
    社員の年齢.社員ID = 所属部署.社員ID

LEFT JOINする際に、どちらにLEFT側のテーブルを記載するかと言うと、
以下の画像のように、最初に記載したほうがLEFTのテーブルになります。

f:id:gotto50105010:20181221233608p:plain

LEFT JOINやRIGHT JOINを利用する際には、
テーブルの記載する順番には気をつけましょう!

RIGHT JOIN

RIHGT JOINは、LEFT JOINと処理が逆になります。
右側のテーブルに対して左側のテーブルをJOINします。

f:id:gotto50105010:20181221233634p:plain

f:id:gotto50105010:20181221233651p:plain

RIHGT JOINのクエリ

SELECT
    社員の年齢.社員ID,
    社員の年齢.社員名,
    社員の年齢.年齢,
    所属部署.部署
FROM
    所属部署
RIHGT JOIN
    社員の年齢
ON
    社員の年齢.社員ID = 所属部署.社員ID

LEFT JOINもRIGHT JOINも書き方は、ほとんど変わりませんね。
JOINの前にLEFTかRIHGTを記載することで処理が異なります。
基本的にJOINしか記載しなかった場合は、INNER JOINになります。

LEFT RIGHTどっちから結合する?

さて、LEFT JOINの両方を解説してきました。
ここで1つ疑問があります。

LEFTとRIHGTどっちに結合すると良いでしょうか?

原則、大きいテーブルの方に結合させてください。
もし、LEFT側のテーブルが大きい場合は、LEFT JOINを使います。
逆にRIGHT側のテーブルが大きい場合は、RIGHT JOINを利用します。

f:id:gotto50105010:20181221233723p:plain

f:id:gotto50105010:20181221233734p:plain

細かな説明は割愛しますが、大きいテーブルに結合するほうが、
処理速度が早くなる可能性が高いからです。

そのため、JOINをする際には、どちらのテーブルが大きいか確認してから、 結合を行うようにしましょう。

参考文献

入門者の方に非常におすすめの本になります。
今回のような入門テーマをわかりやすく解説してくれており、
練習問題までたくさん用意されているので、
SQLの習得に有用ではないかと思います。

スッキリわかるSQL入門 第2版 ドリル222問付き! (スッキリシリーズ)

スッキリわかるSQL入門 第2版 ドリル222問付き! (スッキリシリーズ)

【SQL入門】中間テーブルを複数作成する方法

中間テーブルとは?

WITH句を使えば、一時的なテーブルを作成することができます。
これを利用する目的は、重複するクエリやデータを利用する際に、
何度も同じクエリを記載したり、処理する必要がなくなるため、
クエリの可読性が上がることがメリットです。

WITH句はどうやって使う?

念の為、WITH句を使って一時的なテーブルを作成する方法をご紹介しましょう。

記述方法

WITH temp_table as  (
SELECT
    col1,
    col2
FROM
    sample_table
) 

SELECT
    col1
FROM
    temp_table

このようにして、WITHの後にテーブル名を記載し、
カッコの中にテーブルを処理するクエリを書いております。

こうすることで、作成されたtemp_table
下の方のクエリで参照されて利用できるようになりました。

中間テーブルを複数作りたい

さて、ここからが本題になります。
先程ご紹介したWITH句ですが、複数の中間テーブルを作成したい場合、
以下のような記載方法になります。

WITH temp_table_1 AS (
SELECT
    colA,
    colB
FROM
    sample_table
    )
    
, temp_table_2 AS (
SELECT
    colA,
    colB
FROM
    temp_table_1
)   

SELECT
    colA
FROM
    temp_table_2

このように、,を使うことで、複数の中間テーブルを作成することができます。

参考文献

入門者の方に非常におすすめの本になります。
今回のような入門テーマをわかりやすく解説してくれており、
練習問題までたくさん用意されているので、
SQLの習得に有用ではないかと思います。

スッキリわかるSQL入門 第2版 ドリル222問付き! (スッキリシリーズ)

スッキリわかるSQL入門 第2版 ドリル222問付き! (スッキリシリーズ)

【tableau】計算フィールドを使って日付の差分を計算する

計算フィールドを使って日付の差分を算出

さて、今回は日付の差分を算出するために、計算フィールドを利用したいと思います。
利用するデータは、tableauで有名なサンプルデータスーパーストアです。

やりたいこと

オーダー日と出荷日の差分を取得して、平均期間を算出します。
それを地域ごとに比較して、最も出荷までに時間がかかる地域を明らかにします。

参考文献

tableauの参考文献といえば、こちらの本になると思います。
内容はかなりボリュームがあり、この本に書いている内容を理解できると、
日常で使う上ではまず大体のことはできてしまうでしょう。

Tableauデータ分析~入門から実践まで~

Tableauデータ分析~入門から実践まで~

実践

STEP①

スーパーストアのデータを読み込みましょう。
今回利用するのは、「オーダー日」と「出荷日」です。

f:id:gotto50105010:20181209113357p:plain

ディメンジョンに2つが存在することを確認してください。

STEP②

メジャーの空白部分で右クリックを押し、
[計算フィールドの作成]を選択してください。

f:id:gotto50105010:20181209113403p:plain

STEP③

計算フィールド内に、以下のように記載します。

f:id:gotto50105010:20181209113412p:plain

日付の差分を算出するために利用した関数は、DATEDIFF関数です。

DATEDIFF関数とは?

2つの日付の差を返す関数です。
この関数には、DATEDIFF('期間区分', 開始日, 終了日)という形で、
3つの引数を与える必要があります。

引数それぞれに対して説明をいたします。

引数①:期間区分
計算した結果の単位です。
"日数"なのか"ヶ月"など、返す値の単位を指定します。
この部分に与えられる引数として、day, week, monthなどがあります。

引数②:開始日
これは文字通り、いつを開始日として計算するか?ですよね。
今回の例では出荷までの期間を知りたいので、「オーダー日」を開始日としました。

引数③:終了日
こちらも文字通り、いつまでを表す終了日です。
今回の例では「出荷日」が終了日となります。

STEP④

さて、今回は地域ごとの出荷までの期間なので、
ディメンションの「地域」を行に置きましょう。

f:id:gotto50105010:20181209113422p:plain

STEP⑤

先程計算フィールドで算出した、差分を表の中にドラッグアンドドロップ
すると、千単位の数値が並びましたね。

f:id:gotto50105010:20181209113446p:plain

これは、値が合計値で現れているからです。
合計を平均に変換しましょう。

f:id:gotto50105010:20181209113434p:plain

マークに存在する「日付差分」を右クリックして、
メジャーを合計から平均に変えます。

f:id:gotto50105010:20181209113454p:plain

これで、地域ごとの平均出荷日数がわかりましたね。
ちなみに関西地域が最も出荷までに時間がかかっているようです。

まとめ

このように差分を計算したいときには、計算フィールドを利用し、
DATEDIFF関数を使います。

tableauには、他にも便利な関数などが用意されているので、
分析をする際には、きっと役に立つと思います。

こちらの本にも詳しく記載されているので、
一度読んでおいて損は無いと思います。

Tableauデータ分析~入門から実践まで~

Tableauデータ分析~入門から実践まで~

【SQL】レベル別おすすめ参考書4冊

初級

これからSQLを始める人におすすめ!

スッキリわかるSQL入門 第2版 ドリル222問付き! (スッキリシリーズ)

スッキリわかるSQL入門 第2版 ドリル222問付き! (スッキリシリーズ)

こちらの本は、これからSQLを学び始めるという方に非常にオススメです。
おすすめのポイントとしては、練習問題が非常に沢山用意されているところです。
いくら分かりやすい解説でいくら説明されても、
実際に自分で書かなければ習得したと言えません。

その点、こちらの本はドリル形式になっており、
ブラウザから学習サイトを開き、SQLを書いて勉強することができます。

脱超初心者を目指すなら

SQL 第2版 ゼロからはじめるデータベース操作 (プログラミング学習シリーズ)

SQL 第2版 ゼロからはじめるデータベース操作 (プログラミング学習シリーズ)

先程ご紹介した本でも十分勉強になるのですが、
もう少し踏み込んだ内容も勉強したい方にオススメです。

1冊目の本で勉強して、SQLの書き方はだいたいわかったが、
ウィンドウ関数?HAVING?となっている方にはオススメです。

中級

初級から中級の架け橋として

達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ (CodeZine BOOKS)

達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ (CodeZine BOOKS)

こちらの本は、SQLの書き方を網羅的に解説するのではなく、
初心者から中級者に向けて架け橋的な参考書になっております。

SQLの書き方が一通り理解したが、CASE文やEXISTSなどを
使いこなせていないかも。。と思う方
にはおすすめの本になります。

私自身、HAVINGはあまり使っていなかったのですが、
この参考書を読んでからは、積極的に使ってみようとなりました。

また、EXISTS関数がどれほど便利な関数か理解できたため、
これまでの冗長なSQLを改善することができたと思います。

上級

分析でSQLを使う人にオススメ

ビッグデータ分析・活用のためのSQLレシピ

ビッグデータ分析・活用のためのSQLレシピ

こちらは、現場で実際にSQLを使って分析を行う人にオススメの本になります。
ウェブサイトに訪問した人やアプリ利用者のログを分析するときに使うような
具体的な集計や処理の方法に関してサンプルを用いながら示してくれています。

SQLを用いた集計方法などは、意外に参考書が少なく、
本屋さんに行っても、SQL入門書やデータベースに関しての本はたくさんあるのに、
分析で利用するSQLに関しては書籍が少ないのは事実です。



今回はレベル別にSQLの参考書に関してまとめてみました。
データベース設計というよりは、どうやって欲しい数値をSQLで書くかに特化して
おすすめできる参考書をご紹介しました。

ぜひ、これからSQLを使い始める人には、利用していただきたい本ばかりです。