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を省略して書くことができた
コメント