どんなプロジェクトでも必ず必要になるテーブル結合のSQL。
結合用のJOIN句の種類とレコード取得結果はどうなるんだけっけ...と、記憶があやふやになることがあるので簡単にまとめて備忘録とする。
なお、この記事ではメインで使用する以下3つのJOIN句の情報をまとめています。
・INNER JOIN
・LEFT JOIN
・RIGHT JOIN
結合処理の内容をさらっと確認したい人へ
簡単に確認を済ませたい人はこの方のツイート内容がおすすめ。
図を使ってくれているので非常にわかりやすい!
この図を確認した上で以下の文章を読み進めても良いかもです。
テーブル例
例として使用するテーブルは以下の2つです。
・userテーブル
・user_orderテーブル(ユーザーの注文を管理するテーブル)
データ内容はこんな感じ
userテーブル
mysql> SELECT * FROM user;
+---------+--------+----------+
| user_id | name | order_id |
+---------+--------+----------+
| 1 | 高橋 | 1 |
| 2 | 山田 | 2 |
| 3 | 青木 | 3 |
| 4 | 井上 | 4 |
| 5 | 澁谷 | 5 |
| 6 | 遠藤 | 6 |
+---------+--------+----------+
user_orderテーブル
mysql> SELECT * FROM user_order;
+----------+---------+-----------------------------------------+
| order_id | user_id | order_name |
+----------+---------+-----------------------------------------+
| 1 | 1 | ビッグマック |
| 2 | 2 | チーズバーガー |
| 3 | 3 | テリヤキバーガー |
| 4 | 10 | フィレオフィッシュバーガー |
+----------+---------+-----------------------------------------+
なお、今回は全てuserテーブル起点(from user)で考え、JOINに使用するカラムは、
user_orderテーブルの「user_id」カラムとします。
1. INNER JOIN 文
SELECT * FROM
user
INNER JOIN
user_order
ON
user_order.user_id = user.user_id;
INNER JOINのポイント
・JOINで指定したカラムの値が一致するレコードのみ出力される
SQL実行結果
+---------+--------+----------+----------+---------+--------------------------+
| user_id | name | order_id | order_id | user_id | order_name |
+---------+--------+----------+----------+---------+--------------------------+
| 1 | 高橋 | 1 | 1 | 1 | ビッグマック |
| 2 | 山田 | 2 | 2 | 2 | チーズバーガー |
| 3 | 青木 | 3 | 3 | 3 | テリヤキバーガー |
+---------+--------+----------+----------+---------+--------------------------+
2. LEFT JOIN 文
SELECT * FROM
user
LEFT JOIN
user_order
ON
user_order.user_id = user.user_id;
LEFT JOINのポイント
・from句で指定したテーブル側のレコードは全て出力
・JOINで指定したカラムの値が一致するレコード → データを連結して出力
・JOINで指定したカラム値が一致しないレコード → 結合相手(user_order)のテーブルカラム値をnullにして出力
SQL実行結果
+---------+--------+----------+----------+---------+--------------------------+
| user_id | name | order_id | order_id | user_id | order_name |
+---------+--------+----------+----------+---------+--------------------------+
| 1 | 高橋 | 1 | 1 | 1 | ビッグマック |
| 2 | 山田 | 2 | 2 | 2 | チーズバーガー |
| 3 | 青木 | 3 | 3 | 3 | テリヤキバーガー |
| 4 | 井上 | 4 | NULL | NULL | NULL |
| 5 | 澁谷 | 5 | NULL | NULL | NULL |
| 6 | 遠藤 | 6 | NULL | NULL | NULL |
+---------+--------+----------+----------+---------+--------------------------+
3. RIGHT JOIN 文
SELECT * FROM
user
RIGHT JOIN
user_order
ON
user_order.user_id = user.user_id;
RIGHT JOINのポイント
・結合相手側(user_order)のテーブルレコードは全て出力
・JOINで指定したカラムの値が一致するレコード → データを連結して出力
・JOINで指定したカラム値が一致しないレコード → from句で指定した側のテーブルカラム値をnull状態にして出力
SQL実行結果
+---------+--------+----------+----------+---------+-----------------------------+
| user_id | name | order_id | order_id | user_id | order_name |
+---------+--------+----------+----------+---------+-----------------------------+
| 1 | 高橋 | 1 | 1 | 1 | ビッグマック |
| 2 | 山田 | 2 | 2 | 2 | チーズバーガー |
| 3 | 青木 | 3 | 3 | 3 | テリヤキバーガー |
| NULL | NULL | NULL | 4 | 10 | フィレオフィッシュバーガー |
+---------+--------+----------+----------+---------+-----------------------------+
以上です!!