MySQLでLEFT JOINを使うと、FROMに指定したテーブルを元にして外部結合することができます。
この記事では、LEFT JOINを使ってテーブルを結合する方法について書いています。
MySQLのバージョン8.0.33で、動作を検証しました。
MySQLでLEFT JOINを使って外部結合する
LEFT JOINでは、FROMに指定したテーブルを元にして、テーブルを結合することができます。
FROMに指定しているレコードは全て表示対象になって、LEFT JOINするテーブルはONで指定した値があるものだけ表示されます。

日本語で書くと、下記のようにしてSQLを組み立て、結合することができます。
SELECT
取得したいカラム...
FROM テーブル
LEFT JOIN 外部結合するテーブル ON テーブル.結合カラム = 外部結合するテーブル.結合カラム
ここでは、2つのテーブルのみが登場していますが、複数テーブルを対象にして結合することもできます。
次項から、実際にテストデータでSQLを実行して確認していきます。
テストデータ
テストデータとして、下記のテーブルを使います。
usersテーブルはユーザー情報が入っているテーブルです。
| id | name | age | birthday |
|---|---|---|---|
| 1 | jiro | 23 | 2000-01-01 |
| 2 | taro | 25 | 1998-01-01 |
| 3 | hanako | 26 | 1997-01-01 |
| 4 | yasuaki | 32 | 1991-01-01 |
messagesテーブルはユーザーが投稿したメッセージという想定です。
| id | user_id | message | created_at | updated_at |
|---|---|---|---|---|
| 1 | 1 | テストメッセージです1 | 2023-05-18 00:00:00 | 2023-05-18 00:00:00 |
| 2 | 1 | テストメッセージです2 | 2023-05-18 00:00:00 | 2023-05-18 00:00:00 |
| 3 | 3 | テストメッセージです3 | 2023-05-18 00:00:00 | 2023-05-18 00:00:00 |
| 4 | 3 | テストメッセージです4 | 2023-05-18 00:00:00 | 2023-05-18 00:00:00 |
LEFT JOINする
usersテーブルをFROMに指定して、messagesテーブルを外部結合するテーブルに指定します。
SELECT * FROM users
LEFT JOIN messages ON messages.user_id = users.id;
usersテーブルとmessagesテーブルをONで指定したカラムで結合しています。
今回はusersテーブルのIDを結合条件にしています。
LEFT JOINなので、usersテーブルは全て取得対象になりますが、messagesは同じIDが存在するレコードだけが対象になります。
SQLを実行すると、下記のようにレコードが返ってきました。
| id | name | age | birthday | id | user_id | message | created_at | updated_at |
|---|---|---|---|---|---|---|---|---|
| 1 | jiro | 23 | 2000-01-01 | 2 | 1 | テストメッセージです2 | 2023-05-18 00:00:00 | 2023-05-18 00:00:00 |
| 1 | jiro | 23 | 2000-01-01 | 1 | 1 | テストメッセージです1 | 2023-05-18 00:00:00 | 2023-05-18 00:00:00 |
| 2 | taro | 25 | 1998-01-01 | NULL | NULL | NULL | NULL | NULL |
| 3 | hanako | 26 | 1997-01-01 | 4 | 3 | テストメッセージです4 | 2023-05-18 00:00:00 | 2023-05-18 00:00:00 |
| 3 | hanako | 26 | 1997-01-01 | 3 | 3 | テストメッセージです3 | 2023-05-18 00:00:00 | 2023-05-18 00:00:00 |
| 4 | yasuaki | 32 | 1991-01-01 | NULL | NULL | NULL | NULL | NULL |
usersテーブルを対象にしているので、usersテーブルのレコードは全て返ってきます。
messagesテーブルのレコードはuserのIDで結合して、usersテーブルに存在した値のみ、レコードが返ってきます。
最初のカラムのidはusersテーブルのidです。
「2・4」のレコードを見ると、messagesテーブルの同じユーザーIDのレコードが存在しないのでNULLになりました。
このようにLEFT JOINでは、FROMで指定したテーブルに存在するレコードのみ、結合されて一緒に表示されます。
表示するカラムを指定する
先ほどは「*」を使って、全てのカラムを指定してきました。
取得したいカラムだけ、指定してみます。
SELECT
users.id,
users.name,
messages.id AS message_id,
messages.message
FROM users
LEFT JOIN messages ON messages.user_id = users.id;
実行すると、下記のようにレコードが返ってきます。
| id | name | message_id | message |
|---|---|---|---|
| 1 | jiro | 2 | テストメッセージです2 |
| 1 | jiro | 1 | テストメッセージです1 |
| 2 | taro | NULL | NULL |
| 3 | hanako | 4 | テストメッセージです4 |
| 3 | hanako | 3 | テストメッセージです3 |
| 4 | yasuaki | NULL | NULL |
users.idでusersテーブルのidカラムを指定しました。
次にusers.nameでusersテーブルのnameカラムを指定しています。
このように「テーブル名.カラム名」で、結合した結果のカラムを指定して返すことができます。
messagesのidカラムについては、名前が被らないようにASをつけてmessage_idという名前で返しました。
別名をつけて見やすくする
テーブルに別名をつけることで、SQLを見やすくできます。
SELECT
u.id,
u.name,
m.id AS message_id,
m.message
FROM users AS u
LEFT JOIN messages AS m ON m.user_id = u.id;
usersテーブルの別名としてuを使っています。
messagesテーブルの別名としてmを使いました。
このようにASを指定して別名を定義することで、「別名.カラム名」でテーブルのカラムを指定することができます。
こちらのSQLは、実行すると同じ結果が返ってきます。
MySQLでLEFT JOINを使って外部結合する方法まとめ
今回はMySQLでLEFT JOINを使って外部結合する方法について書きました。
記事の内容をまとめると、下記のようになります。
・FROMに指定したテーブルのレコード全てが表示対象になって、ない場合にはNULLが返ってくる
・「テーブル名.カラム名」で結合結果のカラムを指定できる
・別名を使うことで、SQLを省略して書くことができた

コメント