次のような2つのテーブルがあります。
> SELECT * FROM table_a;
+------+------+
| id | name |
+------+------+
| 1 | row1 |
| 2 | row2 |
+------+------+
> SELECT * FROM table_b;
+------+------+------+
| id | name | aid |
+------+------+------+
| 3 | row3 | 1 |
| 4 | row4 | 1 |
| 5 | row5 | NULL |
+------+------+------+
INNER JOINは両方のテーブルを処理します
INNER JOINは両方のテーブルを処理するため、両方のテーブルに1つしかない場合にのみ行が取得されます。一致するペアが複数ある場合は、複数の行が表示されます。
> SELECT * FROM table_a a INNER JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id | name | id | name | aid |
+------+------+------+------+------+
| 1 | row1 | 3 | row3 | 1 |
| 1 | row1 | 4 | row4 | 1 |
+------+------+------+------+------+
順序を逆にしても、INNER JOINに違いはありません。これは、両方のテーブルが考慮されるためです。
> SELECT * FROM table_b b INNER JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id | name | aid | id | name |
+------+------+------+------+------+
| 3 | row3 | 1 | 1 | row1 |
| 4 | row4 | 1 | 1 | row1 |
+------+------+------+------+------+
同じ行を取得しますが、列の順序は異なります。これは、表の順序が異なるためです。
LEFT JOINは最初のテーブルのみを考慮します
LEFT JOINは指定した最初のテーブルを考慮し、2番目のテーブルはあまり考慮しないため、2番目に対応する行がない場合でも、常に最初のテーブルから行を取得します。
> SELECT * FROM table_a a LEFT JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id | name | id | name | aid |
+------+------+------+------+------+
| 1 | row1 | 3 | row3 | 1 |
| 1 | row1 | 4 | row4 | 1 |
| 2 | row2 | NULL | NULL | NULL |
+------+------+------+------+------+
上記では、table_aのすべての行が表示されますが、それらの一部はテーブルbのどの行とも一致しませんが、table_bのすべての行ではなく、table_aの何かと一致する行のみが表示されます。
テーブルの順序を逆にすると、LEFT JOINの動作が異なります。
> SELECT * FROM table_b b LEFT JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id | name | aid | id | name |
+------+------+------+------+------+
| 3 | row3 | 1 | 1 | row1 |
| 4 | row4 | 1 | 1 | row1 |
| 5 | row5 | NULL | NULL | NULL |
+------+------+------+------+------+
これで、table_bのすべての行が取得されますが、table_aの一致する行のみが取得されます。
RIGHT JOINは2番目のテーブルのみを考慮します
a RIGHT JOIN b
とまったく同じ行を取得しますb LEFT JOIN a
。唯一の違いは、列のデフォルトの順序です。
> SELECT * FROM table_a a RIGHT JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id | name | id | name | aid |
+------+------+------+------+------+
| 1 | row1 | 3 | row3 | 1 |
| 1 | row1 | 4 | row4 | 1 |
| NULL | NULL | 5 | row5 | NULL |
+------+------+------+------+------+
これは、table_b LEFT JOIN table_a
LEFT JOINセクションで見たと同じ行です。
同様に:
> SELECT * FROM table_b b RIGHT JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id | name | aid | id | name |
+------+------+------+------+------+
| 3 | row3 | 1 | 1 | row1 |
| 4 | row4 | 1 | 1 | row1 |
| NULL | NULL | NULL | 2 | row2 |
+------+------+------+------+------+
と同じ行table_a LEFT JOIN table_b
です。
まったく参加しないため、すべてのコピーが得られます
結合句なし:コンマで区切られたJOIN句をまったく使用せずにテーブルを書き込む場合、可能なすべての組み合わせで、2番目のテーブルのすべての行の隣に最初のテーブルのすべての行が書き込まれます。
> SELECT * FROM table_b, table_a;
+------+------+------+------+------+
| id | name | aid | id | name |
+------+------+------+------+------+
| 3 | row3 | 1 | 1 | row1 |
| 3 | row3 | 1 | 2 | row2 |
| 4 | row4 | 1 | 1 | row1 |
| 4 | row4 | 1 | 2 | row2 |
| 5 | row5 | NULL | 1 | row1 |
| 5 | row5 | NULL | 2 | row2 |
+------+------+------+------+------+
(これは私のブログ投稿SQL結合タイプの例からのものです)