元エンジニアPMのプロダクトマネージャーお役立ち情報

スタートアップから大規模プロダクトまで担当している元エンジニアの筆者が、事業開発・プロダクトマネジメントに役立つ情報を発信します

【SQL初心者向け】left joinとjoinの使い方や使い分けを図解して説明する

異なるテーブルを結合してデータを出す時に、必要になってくるのがJOIN(結合)です。SQLにはjoinやleft joinright joinなど様々な結合の仕方がありますが、joinの使い分け正しくできていますか?

結合の使い分けで大事なのはデータをどのように抽出したいかです。
例えば重複したデータを出したいのであればjoin (inner join)を利用しますし、片方のテーブルには無いが、もう片方のテーブルにはあるものを出したい場合は、outer join (left outer joinやright outer join)を利用します。
この記事ではサンプルデータを利用して、joinとleft joinの違いや、使い分けをわかりやすく説明していきたいと思います。

サンプルとしてユーザーがどの商品を何個買ったか?を管理するテーブルと、商品情報が管理されているテーブルを例としましょう。

ユーザーが購入した商品数分の売上を出したいとします。まずjoin (inner join)を使ってみることにしましょう。

select
  user_id,
  product_id,
  quantity * price
from purchase
inner join product on 
purchase.product_id = product.product_id

この時の結果は、どちらのテーブルにも存在する商品IDのアイテムのみ結果として出力されます。そのため商品IDが101,102,103は表示されますが、104のアイテムは結果として表示されません。
(商品ID104を商品情報テーブルで物理削除してしまった場合などですね) このようにどちらのテーブルにも存在するデータだけを抽出したい場合に使うのが、joinになります。

join (inner join)とは[内部結合]

テーブル同士を内部結合した場合、指定した条件に合致したレコードのみを取り出します。 そのため、結合可能なレコードが存在しない場合はレコードを取得しないのが内部結合です。

先程の例に戻りましょう。商品情報が管理されていないからといって商品ID104の購入を無かったことにするわけにはいきませんよね?このように片方のテーブルにはデータが存在するが、片方のテーブルにはデータが存在しない時もデータを抽出するときに使えるのがouter joinです。(left, rightはデータを残すテーブルを指定する向きだと思ってください)

select
  user_id,
  product_id,
  quantity * price
from purchase
left join product on 
purchase.product_id = product.product_id

このようにleft joinを実行してみました。left joinによりpurchaseテーブルのデータはすべて取得した状態で、productテーブルと結合してくれます。そのため商品ID104もデータとして表示されることになります。  

outer join(left outer join / right outer join)とは[外部結合]

複数のテーブルのデータを結合の可否に関わらず結合先のデータを全て表示してくれます。left, rightはデータを残しておくテーブルの先を示します。 結合可能なレコードが存在しない場合も、データを表示してくれます。その場合レコードが存在しない方はnullが返ってきます。

例えば商品情報に保存されているデータが大量にあり、商品として取り扱ってはいるがユーザーの購入履歴が無い商品をイメージしてみてください。
すべての商品が何個売れたか?を抽出する場合、商品情報が欠けてしまってはいけないですよね?その場合right joinを利用してproductテーブルのデータをすべて表示するわけです。

またleft joinとright joinは取得するテーブルの順番が変われば逆になります。先程のクエリだとselect * from productで始まる場合は、左がproductになりますね。

left joinの使い道

データ分析の実務では、left joinやinner joinを良く使いますので他の具体例も紹介します。例えばユーザーテーブルと注文テーブルをイメージしてください。 ユーザーのデータをすべて表示することで、そのユーザーが注文した商品を表示したり、注文がないユーザーを特定することができます。(これは注文がないテーブルにはユーザーIDが存在していないのでnullとして返ってくるため)

いかがでしたでしょうか?left joinやjoinは図解したように、どのデータまでを抽出したいかをイメージすれば簡単に使い分けすることができます。ぜひ試してみてくださいね。