はじめに
表題の通り、SQLのテーブル結合について復習ついでに初心者にもわかりやすく記載していますので、気になる方はよろしければ一読いただければと思います
目次
🪄 JOINって何?
JOINは、複数のテーブルをくっつけて使いたいときに使うSQLの機能
です。
例えるなら
- 社員の情報(社員ID、名前)が入ったテーブルと、社員の給料情報(社員ID、給料)が入ったテーブルを共通情報である「社員ID」でくっつけて「名前+給料」と1つの表にすることができます。
🪄 INNER JOIN
役割
- 共通部分だけを抽出! 2つのテーブルの「共通部分」だけを取り出す。
特徴
- 両方のテーブルにマッチする行のみを結果として返します。
- どちらか一方のテーブルにしか存在しないデータは、結果セットには含まれません。
ユースケース
- 注文データと顧客データがあり、実際に注文した顧客の情報だけを知りたい場合
- ユーザーと投稿があり、投稿があるユーザーの情報だけを抽出したい場合
例
「顧客テーブル」と「注文テーブル」から、注文実績のある顧客とその注文情報だけを取得したい場合
SELECT *
FROM 顧客テーブル
INNER JOIN 注文テーブル ON 顧客テーブル.顧客ID = 注文テーブル.顧客ID;
🪄 LEFT JOIN
役割
- 左側のテーブルを「全網羅」! 左側のテーブル(FROM句で最初に指定したテーブル)のデータを「網羅」したいときに使います。
特徴
- 左側のテーブルの全ての行を結果として返します。
- 右側のテーブルにマッチする行があれば、そのデータを結合します。
- 右側のテーブルにマッチする行がなければ、右側のカラムはNULLで埋められます。
ユースケース
- 全ての顧客リストを表示し、注文実績がある顧客にはその注文情報も表示したいが、注文がなくても顧客情報は表示したい場合
- 全ての製品リストを表示し、売上があればその売上情報も表示したいが、売上がなくても製品情報は表示したい場合
例
「顧客テーブル」と「注文テーブル」から、全ての顧客情報(注文がなくても)と、もしあればその注文情報を取得したい場合
SELECT *
FROM 顧客テーブル
LEFT JOIN 注文テーブル ON 顧客テーブル.顧客ID = 注文テーブル.顧客ID;
🪄 RIGHT JOIN
役割
- 右側のテーブルを「全網羅」!
- LEFT JOINのちょうど逆です。右側のテーブル(JOIN句で後に指定したテーブル)のデータを「網羅」したいときに使います。
- 右側のテーブルを「主役」として、それに紐づく左側のテーブルの情報を付け加える。紐づく情報がなければNULLになる。
特徴
- 右側のテーブルの全ての行を結果として返します。
- 左側のテーブルにマッチする行があれば、そのデータを結合します。
- 左側のテーブルにマッチする行がなければ、左側のカラムはNULLで埋められます。
ユースケース
- 全ての注文リストを表示し、紐づく顧客情報があれば表示したいが、何らかの理由で顧客情報が紐づいていない注文も表示したい場合。
- あまり多くはありませんが、データクレンジングなどで使うこともあります。
例
「顧客テーブル」と「注文テーブル」から、全ての注文情報(顧客情報が紐づいていなくても)と、もしあればその顧客情報を取得したい場合
SELECT *
FROM 顧客テーブル
RIGHT JOIN 注文テーブル ON 顧客テーブル.顧客ID = 注文テーブル.顧客ID;
🎉 まとめ
JOINの種類 | イメージ | 特徴 |
---|---|---|
INNER | 共通部分 | 両方のテーブルにマッチする行のみ |
LEFT | 左側を主役、右側を補足 | 左側のテーブルの全行 + マッチする右側の行(なければNULL) |
RIGHT | 右側を主役、左側を補足 | 右側のテーブルの全行 + マッチする左側の行(なければNULL) |