この投稿はアイスタイル Advent Calendar 2023 の23日目の記事です。
対象者:
SQLをこれから書きたい方、書こうとしている方
始めに
初めまして、istyleのすぎたです。
昨期、事業部門から分析支援・推進を行うデータ戦略推進室というところに異動しまして、日々SQLを書く日々を過ごしています。
その中でも、SQLを書く上で大切なことは色々あるかと思いますが、
まず、SQL触り始めの最初の壁は、間違いなくJOINかなと思います。
また、その中でも、JOINでよく見かけるのはINNER JOINとLEFT JOINの2つだと思います。
なので、今日はその二つの結合についてと使い分けについてお話したいと思います。
そもそもJOIN(結合)とは?
JOINとは、別々のテーブルをくっつける処理のことです。
例えば、顧客情報を持つテーブルと顧客がなんの注文をしたかの情報を持つ注文テーブルがあったとします。
それらを結合(JOIN)することで、関連する情報を組み合わせることができます。
Excelやスプレッドシートでいうvlookup関数に該当する処理がSQLだとJOINで実行することが可能です。
テーブル結合の種類について
一般的に使用されるテーブル結合は全部で5種類あります。(以下、記載)
・INNER JOIN(内部結合)
・LEFT JOIN(左外部結合)
・RIGHT JOIN(右外部結合)
・FULL OUTER JOIN(完全外部結合)
・CROSS JOIN(クロス結合)
しかし、今回は冒頭でも説明した通り、以下のよく見かけるINNER JOINとLEFT JOINの2種類についてお話します。
今回は、この二つのテーブルを結合することを例に進めたいと思います。
□顧客テーブル
□注文テーブル
LEFT JOINとは?--実際に結合してみよう
このJOINを使用すると、左側のテーブルの全ての行を保持しつつ、右側のテーブルの該当する行が存在する場合に結合します。
SELECT *
FROM 顧客テーブル
LEFT JOIN 顧客テーブル
ON 顧客テーブル.customer_id = 注文テーブル.customer_id
こんな感じで、左側のテーブル(顧客テーブル)の内容を全て保持しつつ、customer_idが一致するものを全てくっつけてくれます。そして左側テーブルには存在するけど、くっつけたテーブルに存在しないcustomer_idについてはnullという形で登場させてくれます。なので、まさにこちらがvlookup関数と似たような使い方が可能です。
INNER JOINとは?--実際に結合してみよう
このJOINを使用すると、両方のテーブルに共通して存在する行のみを結合して取得することができます。
SELECT *
FROM 顧客テーブル
INNER JOIN 注文テーブル
ON 顧客テーブル.customer_id = 注文テーブル.customer_id
こちらだと、こんな感じで、出力されます。LEFT JOINとの違いにお気づきでしょうか?
そうなんです。こっちだと、null表示されていた木梨さんが消えてしまいます。
二つの結合方法の使い分けについて
最後に使い分けについてです。
全ユーザーを見たい場合は、LEFT JOIN、重複するユーザーだけ見たいときはINNER JOINを使ってみてください。