内部結合や外部結合について学んだことを備忘録として書き留めます。
前提のテーブル
usersテーブル
id | name | message_id |
---|---|---|
1 | hoge | 2 |
2 | huga | 3 |
3 | foo | NULL |
4 | var | 1 |
5 | piyo | 2 |
messagesテーブル
id | content |
---|---|
1 | おはよう |
2 | こんにちは |
3 | こんばんは |
4 | おばんです |
内部結合
SQL実行
内部結合にはINNER JOINを使います。
SELECT * FROM users INNER JOIN messages ON users.message_id = messages.id;
id | name | messages_id | id | content |
---|---|---|---|---|
1 | hoge | 2 | 2 | こんにちは |
2 | huga | 3 | 3 | こんばんは |
4 | var | 1 | 1 | おはよう |
5 | piyo | 2 | 2 | こんにちは |
この時、テーブル内のINNER JOINの条件に一致しないレコード(この場合、usersテーブルのid:3のレコード)は削除されます。
内部結合をすることで一つのテーブルになっているので
SELECT users.id, users.name, messages.content FROM users INNER JOIN messages ON users.message_id = messages.id;
id | name | content |
---|---|---|
1 | hoge | こんにちは |
2 | huga | こんばんは |
4 | var | おはよう |
5 | piyo | こんにちは |
こういった様に必要な要素だけのわかりやすいテーブルを出力することができます。
外部結合
外部結合はLEFT(RIGHT) OUTER JOINを使います。
左外部結合、右外部結合があり、
どちらのテーブルを主として結合するかによって使い分けます。
そして前述の内部結合と違い、
一致しないレコードは削除されず、その対応する値が無い場合にはNULLが入ります。
左外部結合
SELECT * FROM users LEFT OUTER JOIN messages ON users.message_id = messages.ID;
id | name | message_id | id | content |
---|---|---|---|---|
1 | hoge | 2 | 2 | こんにちは |
2 | huga | 3 | 3 | こんばんは |
3 | foo | NULL | NULL | NULL |
4 | var | 1 | 1 | おはよう |
5 | piyo | 2 | 2 | こんにちは |
内部結合では削除されてしまうレコードも利用する必要がある場合はこちらを使うイメージです。
右外部結合
SELECT * FROM users RIGHT OUTER JOIN messages ON users.message_id = messages.ID;
id | name | massage_id | id | content |
---|---|---|---|---|
1 | hoge | 2 | 2 | こんにちは |
2 | huga | 3 | 3 | こんばんは |
4 | var | 1 | 1 | おはよう |
5 | piyo | 2 | 2 | こんにちは |
NULL | NULL | NULL | 4 | おばんです |
このように内部結合、左外部結合とは違い、
右側に結合するテーブルの値を主としてSELECT文を出力することができます。
締め
これらを使い分けて、楽しいSQLライフを送りましょう!