異なるテーブルを結合してデータを出す時に、必要になってくるのが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は図解したように、どのデータまでを抽出したいかをイメージすれば簡単に使い分けすることができます。ぜひ試してみてくださいね。