У меня есть 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 заботится об обеих таблицах, поэтому вы получите строку, только если в обеих таблицах есть одна. Если существует более одной подходящей пары, вы получите несколько строк.
> 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 заботится о первой таблице, которую вы ей предоставляете, и мало заботится о второй, поэтому вы всегда получаете строки из первой таблицы, даже если во второй нет соответствующей строки:
> 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 заботится только о втором столе
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: если вы пишете свои таблицы вообще без предложения JOIN, просто разделяя их запятыми, вы получаете каждую строку первой таблицы, записанную рядом с каждой строкой второй таблицы, в каждой возможной комбинации:
> 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 )