MySQLで内部結合のINNER JOINをする方法について書いています。
INNER JOINは結合するテーブルのどちらにも存在する場合に結合されて、レコードが返ってきます。
結合に使う値がどちらかにしか存在しない行は、レコードが返ってきません。
MySQLのバージョン8.0.15で、動作を検証しました。
MySQLで内部結合(INNER JOIN)する
INNER JOINは、ONで結合するときにキーとなったカラムの値がどちらにもあるときに結合されて、値が返ってきます。
日本語で書くと、下記のようにして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で結合したいテーブルを書いて、ONで条件を指定して結合する
・結果として、表示するカラムは「テーブル名.カラム名」で指定できた
・ASを使うとSQLが見やすくなった
コメント