MySQLでLEFT JOINを使って外部結合する方法!

MySQL MySQL

MySQLでLEFT JOINを使うと、FROMに指定したテーブルを元にして外部結合することができます。
この記事では、LEFT JOINを使ってテーブルを結合する方法について書いています。

MySQLのバージョン8.0.33で、動作を検証しました。

MySQLでLEFT JOINを使って外部結合する

LEFT JOINでは、FROMに指定したテーブルを元にして、テーブルを結合することができます。
FROMに指定しているレコードは全て表示対象になって、LEFT JOINするテーブルはONで指定した値があるものだけ表示されます。

MySQLのLEFT JOIN

日本語で書くと、下記のようにして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を使って外部結合する方法について書きました。
記事の内容をまとめると、下記のようになります。

・LEFT JOINを使って外部結合すると、FROMに指定したテーブルが元になる
・FROMに指定したテーブルのレコード全てが表示対象になって、ない場合にはNULLが返ってくる
・「テーブル名.カラム名」で結合結果のカラムを指定できる
・別名を使うことで、SQLを省略して書くことができた

コメント

タイトルとURLをコピーしました