MySQLで内部結合(INNER JOIN)をする方法!

MySQL MySQL

MySQLで内部結合のINNER JOINをする方法について書いています。

INNER JOINは結合するテーブルのどちらにも存在する場合に結合されて、レコードが返ってきます。
結合に使う値がどちらかにしか存在しない行は、レコードが返ってきません。

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

MySQLで内部結合(INNER JOIN)する

INNER JOINは、ONで結合するときにキーとなったカラムの値がどちらにもあるときに結合されて、値が返ってきます。
MySQLでINNER JOINイメージ

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

SELECT
 取得したいカラム...
FROM テーブル
INNER JOIN 結合するテーブル ON テーブル.結合カラム = 結合するテーブル.結合カラム

2つのテーブルだけでなく、ONで結合条件を指定して、複数のテーブルを結合することができます。
次項から、実際にテストデータで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

INNER JOINする

messagesテーブルとusersテーブルをuser_idを元に内部結合(INNER JOIN)します。

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

SELECTでmessagesテーブルを元にレコードを取得します。
その次の行で、INNER JOINを使ってusersテーブルを指定しています。

ONを使って、messagesテーブルとusersテーブルを結合しています。
結合する元のカラムになるのは、messagesテーブルのuser_idとusersテーブルのidです。

これで、messagesテーブルのuser_idカラムと、usersのidカラムで同じ値の行を結合して取得できます。
実行すると、下記のように4行返ってきました。

id user_id message created_at updated_at id name age birthday
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 1 jiro 23 2000-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 3 hanako 26 1997-01-01

messagesテーブルのカラムから表示されて、その後にusersテーブルのカラムが表示されています。
usersテーブルには、idカラムには「2と4」のレコードもありますが、messageテーブルのuser_idカラムの方に値がないため取得できませんでした。

このように、どちらのカラムにも値が存在するときにレコードが取得できます。

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

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

例えば、下記のようにすると、指定カラムだけ取得できます。

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

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

message_id user_id message name
1 1 テストメッセージです1 jiro
2 1 テストメッセージです2 jiro
3 3 テストメッセージです3 hanako
4 3 テストメッセージです4 hanako

messages.idでmessagesテーブルのidカラムを指しています。
ASキーワードを使うことで、別名にして取得しています。(message_idという別名で返しています)

次にusers.idでusersテーブルのidカラムを指定しました。
その後も同様にして、messageカラム・nameカラムを返しています。

このように「テーブル名.カラム名」で、結合した結果のカラムを指定して返すことができます。

テーブルに別名をつけて見やすくする

先ほどのSQLをテーブルに別名をつけることで、すっきりとさせることができます。
例えば、下記のようにテーブルにASをつけることが可能です。

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

messagesテーブルにmという別名をつけました。
usersテーブルにはuという別名をつけています。

これで、それぞれのテーブルを指定するときに別名を使うことができます。
ONの後の結合条件や、SELECTで取ってくるカラムも別名を指定して返すようにしました。

実行すると、先ほどと同じレコードが返ってきます。
テーブル名が長い場合など、短い名前をつけるとスッキリと見やすくなります。

MySQLで内部結合(INNER JOIN)する方法まとめ

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

・INNER JOINで結合するときは、どちらのテーブルにも値があるものが対象になる
・INNER JOINで結合したいテーブルを書いて、ONで条件を指定して結合する
・結果として、表示するカラムは「テーブル名.カラム名」で指定できた
・ASを使うとSQLが見やすくなった

コメント

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