MySQLのRIGHT JOINについて書いています。
RIGHT JOINを使うと、RIGHT JOINしたテーブルを元にして外部結合することができます。
MySQLのバージョン8.0.33で、動作を検証しました。
MySQLでRIGHT JOINを使って外部結合する
RIGHT JOINでは、RIGHT JOINに指定したテーブルを元にして、テーブルを結合することができます。
RIGHT JOINに指定しているテーブルのレコードは全て表示対象になって、FROMに指定したテーブルはONで指定した値があるものだけ表示されます。
日本語で書くと、下記のようにして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に指定したテーブルのレコード全てが表示対象になる
・「テーブル名.カラム名」で結合結果のカラムを指定できる
・別名を使うことで、SQLを省略して書くことができた
コメント