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

MySQL MySQL

MySQLのRIGHT JOINについて書いています。
RIGHT JOINを使うと、RIGHT JOINしたテーブルを元にして外部結合することができます。

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

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

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

MySQLのRIGHT JOIN

日本語で書くと、下記のようにしてSQLを組み立て、結合することができます。

SELECT
 取得したいカラム...
FROM テーブル
RIGHT 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

RIGHT JOINする

usersテーブルをFROMに指定して、messagesテーブルをRIGHT JOINで外部結合するテーブルに指定します。

SELECT * FROM users
RIGHT JOIN messages ON messages.user_id = users.id;

usersテーブルとmessagesテーブルをONで指定したカラムで結合しています。
今回はusersテーブルのID(ユーザーID)を結合条件にしています。

RIGHT JOINなので、外部結合したmessagesテーブルのレコードが全て対象になります。
usersテーブルのレコードは同じIDが存在するレコードだけが対象になります。

SQLを実行すると、下記のようにレコードが返ってきました。

id name age birthday id user_id message created_at updated_at
1 jiro 23 2000-01-01 1 1 テストメッセージです1 2023-05-18 00:00:00 2023-05-18 00:00:00
1 jiro 23 2000-01-01 2 1 テストメッセージです2 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
3 hanako 26 1997-01-01 4 3 テストメッセージです4 2023-05-18 00:00:00 2023-05-18 00:00:00

RIGHT JOINなので、messagesテーブルのレコードが全て対象になって取得できています。
usersテーブルのレコードは、同じユーザーIDのレコードがあったものだけ返ってきています。

このようにRIGHT JOINでは、外部結合したテーブルに存在するレコードを元に、FROMのレコードを取得して表示します。

表示するカラムを指定する

先ほどは「*」を使って、全てのカラムを指定してきました。
取得したいカラムだけ、指定してみます。

SELECT
  users.id,
  users.age,
  users.name,
  messages.id AS message_id,
  messages.message
FROM users
RIGHT JOIN messages ON messages.user_id = users.id;

実行すると、下記のようにレコードが返ってきます。

id age name message_id message
1 23 jiro 1 テストメッセージです1
1 23 jiro 2 テストメッセージです2
3 26 hanako 3 テストメッセージです3
3 26 hanako 4 テストメッセージです4

users.idでusersテーブルのidカラムを指定しました。
次にusers.ageでusersテーブルのageカラムを指定しています。

このように「テーブル名.カラム名」で、結合した結果のカラムを指定して返すことができます。
messagesのidカラムについては、名前が被らないようにASをつけてmessage_idという名前で返しました。

別名をつけて見やすくする

テーブルに別名をつけることで、SQLを見やすくできます。

SELECT
  u.id,
  u.age,
  u.name,
  m.id AS message_id,
  m.message
FROM users AS u
RIGHT JOIN messages AS m ON m.user_id = u.id;

usersテーブルの別名としてuを使っています。
messagesテーブルの別名としてmを使いました。

このようにASを指定して別名を定義することで、「別名.カラム名」でテーブルのカラムを指定することができます。
こちらのSQLは、実行すると、先ほどと同じ結果が返ってきます。

MySQLでRIGHT JOINを使って外部結合する方法まとめ

今回はMySQLでRIGHT JOINを使って外部結合する方法について書きました。
記事の内容をまとめると、下記のようになります。

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

コメント

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